Re: [問題] js閉包的基礎觀念疑問
你對 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
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
2
3
Ajax 近期熱門文章
PTT數位生活區 即時熱門文章