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
- 閉包
- Swift-逃逸閉包、自動閉包Swift
- 閉包 | 淺談JavaScript閉包問題JavaScript
- 【集合論】關係閉包 ( 關係閉包求法 | 關係圖求閉包 | 關係矩陣求閉包 | 閉包運算與關係性質 | 閉包複合運算 )矩陣
- 閉包是什麼?怎麼形成一個閉包?為什麼使用閉包?
- Swift 閉包Swift
- golang 閉包Golang
- 「閉包」攻略
- PHP 閉包PHP
- JavaScript閉包JavaScript
- JavaScript - 閉包JavaScript
- Golang閉包Golang
- JavaScript 閉包JavaScript
- 理解“閉包”
- 什麼是閉包,閉包的優缺點?
- 什麼是閉包?閉包的作用是什麼?
- js閉包及閉包的經典使用場景JS
- [JavaScript閉包]Javascript閉包的判別,作用和示例JavaScript
- C#閉包C#
- 筆記:閉包筆記
- 亂談閉包
- 閉包的起源
- 函式閉包函式
- JavaScript-閉包JavaScript
- JS閉包ClosureJS
- JavaScript 的閉包JavaScript
- 理解JavaScript 閉包JavaScript
- JavaScript之閉包JavaScript
- Groovy閉包理解
- 閉包作用域
- 再讀閉包
- 閉包問題
- go 閉包函式Go函式
- js閉包的理解JS
- 閉包,是真的美
- js中的閉包JS
- 閉包詳解一
- 淺談js閉包JS