1、什麼是閉包、以及閉包所涉及的作用域鏈這裡就不說了。
2、JavaScript垃圾回收機制
JavaScript不需要手動地釋放內存,它使用一種自動垃圾回收機制(garbage collection)。當一個物件無用的時候,也就是程式中無變數引用這個物件時,就會從記憶體中釋放掉這個變數。
var s = [ 1, 2 ,3];
var s = null;
//這樣原始的陣列[1 ,2 ,3]就會被釋放掉了。
3、循環引用
三個物件 A 、B 、C
AàBàC :A的某一屬性引用著B,同樣C也被B的屬性引用著。如果將A清除,那麼B、C也被釋放。
AàBàCàB :這裡增加了C的某一屬性引用B對象,如果這是清除A,那麼B、C不會被釋放,因為B和C之間產生了循環引用。
var a = {};
a.pro = { a:100 };
a.pro.pro = { b:100 };
a = null ;
//這種情況下,{a:100}和{b:100}就同時也被釋放了。
var obj = {};
obj.pro = { a : 100 };
obj.pro.pro = { b : 200 };
var two = obj.pro.pro;
obj = null;
//這種情況下 {b:200}不會被釋放掉,而{a:100}被釋放了。
4、循環引用與閉包
function outer(){
var obj = {};
function inner(){
//這裡引用了obj物件
}
obj.inner = inner;
}
這是一種及其隱藏的循環引用,。當呼叫一次outer時,就會在其內部創建obj和inner兩個對象,obj的inner屬性引用了inner;同樣inner也引用了obj,這是因為obj仍然在innerFun的封閉環境中,準確的講這是由於JavaScript特有的「作用域鏈」。
因此,閉包非常容易建立循環引用,幸運的是JavaScript能夠很好的處理這種循環引用。
5、IE中的記憶體洩漏
IE中的記憶體洩漏有好幾種,這裡有詳細的解釋(http://msdn.microsoft.com/en-us/library/bb250448.aspx)。
這裡只討論其中一種,即循環引用所造成的記憶體洩漏,因為,這是一種最普遍的情況。
當在DOM元素或一個ActiveX物件與普通JavaScript物件之間存在循環引用時,IE在釋放這類變數時存在特殊的困難,最好手動切斷循環引用,這個bug在IE 7中已經被修復了(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。
“IE 6 suffered from memory leaks when a circular reference between several objects, among which at least one DOM node, was created. This problem has been solved in IE 7. ”
如果上面的例子(第4點)中obj引用的不是一個JavaScript Function物件(inner),而是一個ActiveX物件或Dom元素,這樣在IE中所形成的循環引用無法得到釋放。
function init(){
var elem = document.getElementByid( 'id' );
elem.onclick = function(){
alert('rain-man');
//這裡引用了elem元素
};
}
Elem引用了它的click事件的監聽函數,同樣函數透過其作用域鏈也引用回了elem元素。這樣在IE中即使離開目前頁面也不會釋放這些循環引用。
6、解決方法
基本的方法就是手動清除這個循環引用,下面一個十分簡單的例子,實際應用時可以自行建立一個addEvent()函數,並且在window的unload事件上對所有事件綁定進行清除。
function outer(){
var one = document.getElementById( 'one' );
one.onclick = function(){};
}
window.onunload = function(){
var one = document.getElementById( 'one' );
one.onclick = null;
};
其它方法(by:Douglas Crockford)
/**
* 遍歷某一元素節點及其所有後代元素
*
* @param Elem node 所要清除的元素節點
* @param function func 進行處理的函數
*
*/
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
/**
* 清除dom節點的所有引用,防止記憶體外洩
*
* @param Elem node 所要清除的元素節點
*
*/
function purgeEventHandlers(node) {
walkTheDOM(node, function (e) {
for (var n in e) {
if (typeof e[n] ===
'function') {
e[n] = null;
}
}
});
以上就是JavaScript記憶體洩漏的相關內容以及解決方案了,有需要的小夥伴可以參考下

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境