Re: [問題] js閉包的基礎觀念疑問

看板Ajax作者 (人類)時間4年前 (2020/01/05 22:27), 編輯推噓2(202)
留言4則, 1人參與, 4年前最新討論串2/2 (看更多)
你對 GC 有點誤會。 JavaScript 標準中雖然有定義資料的範圍、operation,但是並沒有定義要如何將 資料存入記憶體。 舉例來說,大部份的 JS 引擎都會把整數存成 int、浮點數存成 double。但其實 標準中這些都是「數字」(Number)。 GC 也一樣,根據不同的存法,不同的引擎也有不同的釋放法。 ※ 引述《paul09253336 (paulma)》之銘言: : 當function greet執行完畢,便會離開execution stack : 而在一般狀況js會透過garbage collection清除變數內容, 不太清楚你所說的「一般狀況」是指什麼狀況,下面給一個永遠不會釋放的例子︰ function greet(word) { console.log(word); } console.log = obj => { setInterval(() => { console.error(obj.length); }, 1000); }; greet("test"); // 無論過多久「"test"」這串字串永遠都會留在記憶體內不會被釋放。 某個資料佔用記憶體,唯一可以釋放它的時機就是「當資料不會被用到的時候」。 上面的例子中,因為該字串一直被使用,所以它永遠不會被釋放。 這個「不會被用到的時候」,一般稱為「unreachable」。 大部份的引擎都是在程式執行一陣子後,才去檢查哪些資料是 unreachable 並且釋放它們,不太可能每執行完一個函式就執行一次 GC。 回到你的問題︰ : js的garbage collection是在什麼時候會執行? 根據不同的實作(e.g. 不同的瀏覽器),任何時候都有可能。 你想關注的應該不是 GC 的時機,而是何時資料會變成 unreachable。 想要瞭解的話,Google "JavaScript Scope Chain" 應該有許多不錯的圖文說明。 如果想要瞭解 GC 的詳細機制,可以參考 v8 的這篇文章︰ https://v8.dev/blog/trash-talk -- ヾ(;ω;) ヾ(;ω;) http://i.imgur.com/oAd97.png
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.114.151 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1578234465.A.AC0.html

01/06 07:56, 4年前 , 1F
謝謝你的回覆 我大概知道我哪邊觀念有問題了
01/06 07:56, 1F

01/06 07:58, 4年前 , 2F
至於說“一般狀況”是指 什麼狀況,我也不太清楚,
01/06 07:58, 2F

01/06 07:58, 4年前 , 3F
這是影片的講者說的,而且就這一句而已,所以才聽
01/06 07:58, 3F

01/06 07:58, 4年前 , 4F
不太懂,
01/06 07:58, 4F
文章代碼(AID): #1U4V9Xh0 (Ajax)
文章代碼(AID): #1U4V9Xh0 (Ajax)