簡體   English   中英

是否會使用 GC 從瀏覽器內存中刪除不在 DOM 中但帶有附加處理程序的元素?

Will element not in DOM but with attached handlers be removerd from browser memory using GC?

提示:本站收集StackOverFlow近2千萬問答,支持中英文搜索,鼠標放在語句上彈窗顯示對應的參考中文或英文, 本站還提供   中文簡體   英文版本   中英對照 版本,有任何建議請聯系yoyou2525@163.com。

為了在我的 js 腳本中獲取圖像尺寸,我創建了臨時<img>元素而不將其附加到 DOM。 這是我編寫的函數的簡化版本:

function testImage(i) {
    let tester = document.createElement('img');
    tester.onload = function() { console.log(tester.naturalWidth); }
    tester.src = `${i}.jpg`;
}
  1. tester僅在函數內部使用。
  2. tester永遠不會被安排到 DOM。
  3. onload 函數對這個tester有一些動作。 我想知道它是否會干擾垃圾收集器。

讓我們假設這可以被多次調用。 那些測試人員會消耗內存嗎? 或者垃圾收集器會刪除它們嗎?

PS:控制台for (let k=0; k < 1000000000; k++) { testImage(k) }吃掉了我的全部記憶。

PS2:我知道我可以編寫腳本來重復使用相同的<img>元素。 但我對第一種方法很好奇。

UPD:正如@rojo 所說的 GC 會清理內存,但在我的情況下我沒有注意到它,因為:

  1. 看起來 GC 不會在同步循環中清理內存(至少在瀏覽器中)。 for (let k=0; k < (1000*1000); k++) { testImage(k) }這一行占用了大量內存,但是使用setTimeout執行 1000 次測試的 1000 次循環重復並不會消耗太多內存。 手動執行不同大小的循環顯示循環完成后釋放的內存。

  2. 這個特定的腳本將許多日志寫入瀏覽器控制台。 如果控制台打開,它會消耗更多內存來保存日志。 當我重寫測試器以防止日志記錄時,打開控制台的內存消耗減少了,但 GC 的工作方式相同。

1 個回復

基於MDN (向下滾動到限制:循環引用),這些變量將被刪除。

一旦函數完成,在函數內部創建的所有變量都將被刪除,沒有例外。

function foo() {
  var a = "data";
  console.log(a); // "data"
} // variable is deleted
console.log(a); // Uncaught ReferenceError: a is not defined

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題
 
粵ICP備18138465號  © 2020-2022 STACKOOM.COM