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

作者: eight0 (欸XD)   2020-01-05 22:27:42
你對 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
作者: paul09253336 (paulma)   2020-01-06 07:56:00
謝謝你的回覆 我大概知道我哪邊觀念有問題了至於說“一般狀況”是指 什麼狀況,我也不太清楚,這是影片的講者說的,而且就這一句而已,所以才聽不太懂,

Links booklink

Contact Us: admin [ a t ] ucptt.com