js--閉包
當在函式內部定義了其他函式時,就建立了閉包。
在後臺執行環境中,閉包的作用域鏈包含著它自己的作用域、外部函式的作用域和全域性作用域。
通常,函式的作用域及其所有變數都會在函式執行結束後被銷燬。
所以,建立並立即呼叫一個函式,既可以執行其中的程式碼,又不會在記憶體中留下對該函式的引用。
但是,當函式返回一個閉包時,這個函式的作用域將會一直在記憶體中儲存到閉包不存在為止。
每個函式在被呼叫時都會自動取得兩個特殊變數:this和arguments,內部函式在搜尋這兩個變數時,只會搜尋到自己的活動物件為止,因此永遠不可能直接訪問外部函式的這兩個變數,所以在閉包函式裡的this,指向的是window物件。
-
例如:
var name = "The Window";var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); //"The Window"
清理記憶體:
function assign(){ var element = document.getElementById("xxx"); var id = element.id; element.onclick = function(){ alert(id); // alert(element.id); } element = null; }
解析:DOM物件往往佔據較大的記憶體,當在閉包函式內直接訪問element.id時,element具有兩個引用數,引用數大於0就無法被垃圾回收。
改進:用id = element.id來取得需要的值,而避免在閉包內對element的整個引用,但此時element依然在外部函式的作用域中被引用,引用數為1依舊大於0,所以為了使element所指物件的引用數0,在使用完後要將element的引用指向null,這樣之前被element引用的物件就可以被垃圾回收了。
相關文章
- js--閉包與垃圾回收機制JS
- 閉包
- 閉包 | 淺談JavaScript閉包問題JavaScript
- Swift-逃逸閉包、自動閉包Swift
- 【集合論】關係閉包 ( 關係閉包求法 | 關係圖求閉包 | 關係矩陣求閉包 | 閉包運算與關係性質 | 閉包複合運算 )矩陣
- PHP 閉包PHP
- JavaScript閉包JavaScript
- Golang閉包Golang
- golang 閉包Golang
- JavaScript 閉包JavaScript
- 理解“閉包”
- Swift 閉包Swift
- Swift,閉包Swift
- 理解閉包
- Swift - 閉包Swift
- lisp 閉包Lisp
- JavaScript - 閉包JavaScript
- javascript閉包—圍觀大神如何解釋閉包JavaScript
- 深入理解javascript原型和閉包(15)——閉包JavaScript原型
- [JavaScript閉包]Javascript閉包的判別,作用和示例JavaScript
- js閉包及閉包的經典使用場景JS
- 筆記:閉包筆記
- C#閉包C#
- JS閉包ClosureJS
- 理解JavaScript 閉包JavaScript
- Groovy閉包理解
- Swift-閉包Swift
- JavaScript 清除閉包JavaScript
- JavaScript 的閉包JavaScript
- JavaScript-閉包JavaScript
- 函式閉包函式
- JavaScript之閉包JavaScript
- PHP 閉包(Closure)PHP
- 閉包函式函式
- 閉包 pythonPython
- 解密JavaScript閉包解密JavaScript
- js-閉包JS
- C# 閉包C#