看板 Ajax 關於我們 聯絡資訊
你對 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
paul09253336: 謝謝你的回覆 我大概知道我哪邊觀念有問題了 01/06 07:56
paul09253336: 至於說“一般狀況”是指 什麼狀況,我也不太清楚, 01/06 07:58
paul09253336: 這是影片的講者說的,而且就這一句而已,所以才聽 01/06 07:58
paul09253336: 不太懂, 01/06 07:58