JavaScript 閉包都會記憶體洩露嗎?

時間 2021-05-12 06:05:20

1樓:愚希

element 會一直存在

function bindEvent(element, a, b) ; element = null; } }

這樣就解決了

2樓:Norkin

題主提出的這個問題很好,一方面作為IT人員,我們應該謹慎對待關乎效能的問題,盡量做到事前處理而非事後諸葛亮,否則,會增加處理的難度;另一方面,這些看起來似乎不起眼的問題,如果深入追究,往往會了解到一些技術內幕,從而進一步提高技術素養。

記得曾在公司做過乙個專案,其中涉及到元素的指令碼化建立和控制,當時沒有注意到記憶體洩漏對效能的影響(因為測試的資料量較小,沒有感覺到明顯的效能下降),投入使用後,客戶反應當資料量較大時(沒達到太過的那種程度)頁面處理速度很慢,尤其是多次與伺服器打交道後(採用ajax通訊)!接到問題反饋後,用瀏覽器的記憶體跟蹤工具(chrome的profiles)跟蹤記憶體使用情況,發現每更新一次占用記憶體就增加2MB-4MB(資料量沒有變化),其原因是對元素繫結事件處理方法後,在元素被移除時未釋放dom物件及dom對映的方法物件導致的記憶體洩漏所致,如果光看增加的記憶體占用數目感覺對效能的影響不大,但2MB的空間可以儲存以萬計的物件,當遍歷(特別是觸發事件)這些物件時,對效能的影響令人髮指!解決方式跟網上介紹的原理一致。

3樓:rambo

vartest_obj=,

1000);}

};test_obj

.closure_fn

();test_obj

=null

;// 嘗試之後,你會發現這他媽才是可怕的。

vartest_obj_2=,

1000);}};

4樓:Jett Lee

第一,這個記憶體洩露問題只存在於低階ie瀏覽器,如ie67

第二,這個問題的原因是因為ie瀏覽器分別用不同的記憶體管理器來管理js物件跟dom元素,如果乙個迴圈同時包含dom元素個js對像,ie無法釋放任何乙個物件

第三,如果把onclick的匿名函式拆分出去,變成引用就不會出現這個問題

5樓:

僅供參考,未作過實驗驗證(附近確實找不到裝IE6和IE7的機器了):

據微軟稱這是IE6在XP上特有的問題,照下面這篇最後更新日期為2023年10月的kb文章

A memory leak occurs in Internet Explorer 6 when you view a Web page that uses JScript scripting on a Windows XP-based computer

的說法,如果你的系統包含了這個更新:

就沒有這個問題了。

javascript 閉包是怎麼回事?

Mine Allen 閉包是指有權訪問另乙個函式作用域中的變數的函式。也就是說,閉包 是乙個函式,這個函式可以有權訪問另乙個函式作用域中的變數。建立閉包的常用方法就是 在乙個函式內部建立另乙個函式。為什麼要說一下閉包呢?因為閉包和作用域鏈有著親密關係。逃 閉包之所以能夠訪問上一級函式的變數,就是因為...

javascript的閉包的概念和ruby的閉包的概念有何異同?

蛙二 概念沒區別,但實現手法有小區別。很多語言 除JS,還有Lua,Scheme 實現閉包的詞法定界,會沿著作用域鏈一層層向上查詢,並把這個詞法範圍內的變數在閉包中另存乙份實體 非引用 而Ruby的作用域規則不允許鏈式地向作用域外查詢,只有用define method消除作用域牆,使原本隔離開的作用...

什麼是閉包?

吻住我的香腸嘴 當乙個函式執行的時候,需要訪問當前函式所在活動物件的上層活動物件 且上層活動物件不是全域性物件 的值物件的值的時候,這個時候就會產生乙個閉包。如果訪問的值乙個在上層活動物件的值物件中,還有乙個在上上層活動物件的值物件中的話,就會產生兩個閉包。簡而言之,閉包只有在函式呼叫時,且需要訪問...