標籤:mil lin js閉包 調用 js 閉包 details 定義 nbsp net
js閉包網站:http://www.cnblogs.com/qieguo/p/5457040.html
什麼是js閉包
有權訪問另一個函數範圍內變數的函數都是閉包。
這裡 f 函數訪問了建構函式 a 裡面的變數 n,所以形成了一個閉包。再來看一段代碼
1 function a() { 2 var n = 0; 3 function f() { 4 n++; 5 console.log(n); 6 } 7 return f; 8 } 9 10 var c = a();11 c(); //控制台輸出112 c(); //控制台輸出2
看看是怎麼執行的:
var c = couter(),這一句 couter()返回的是函數 inc,那這句等同於 var c = f;
c(),這一句等同於 f(); 注意,函數名只是一個標識(指向函數的指標),而()才是執行函數。
後面三句翻譯過來就是: var c = f; f(); f();,跟第一段代碼有區別嗎? 沒有。
為啥要那樣寫?
我們知道,js的每個函數都是一個個小黑屋,它可以擷取外界資訊,但是外界卻無法直接看到裡面的內容。將變數 n 放進小黑屋裡,除了 f 函數之外,沒有其他辦法能接觸到變數 n,而且在函數 a 外定義同名的變數 n 也是互不影響的,這就是所謂的增強“封裝性”。
而之所以要用 return 返回函數標識 f,是因為在 a 函數外部無法直接調用 f 函數,所以 return f與外部聯絡起來。
js閉包的用途
http://blog.csdn.net/sunlylorn/article/details/6534610
我們來看看閉包的用途。事實上,通過使用閉包,我們可以做很多事情。比如類比物件導向的代碼風格;更優雅,更簡潔的表達出代碼;在某些方面提升代碼的執行效率。
1 匿名自執行函數
2緩衝
3 實現封裝
4 閉包的另一個重要用途是實現物件導向中的對象,傳統的對象語言都提供類的模板機制,
js 閉包