含義:閉包是一個概念,它描述了函數執行完畢內存釋放後,依然內存駐留的一個現象,只要把握這個核心概念,閉包就不難理解了數組
function
a(){
var
i=0;
function
b(){
alert(++i);
}
return
b;
}
var
c = a();
c();
|
即,閉包的做用就是在a執行完並返回後,閉包使得Javascript的垃圾回收機制GC不會收回a所佔用的資源,由於a的內部函數b的執行須要依賴a中的變量。閉包
因爲閉包的存在使得函數a返回後,a中的i始終存在,這樣每次執行c(),i都是自加1後alert出i的值。函數
閉包的概念:函數對象能夠經過做用域鏈相互關聯起來,函數體內的變量能夠保存在函數做用域內,這種特性被稱爲閉包。spa
var scope='global scope'; code
function checkscope(){對象
var scope="local scope"; ip
function f(){ return scope; } 內存
return f; ci
} 資源
checkscope()();
咱們知道調用函數checkscope(),咱們獲得的再也不是一個scope值,而是一個函數f;再接着調用函數f(),這裏就出現了一個問題,調用函數f是在全局環境中調用,其中的scope值從何而來?上面提到過一個概念:js是採用的詞法做用域,該scope值仍是來自於該函數即f定義時的做用域,而不是調用時的做用域。因此結果仍是local scope。
在犀牛書上還碰見一個例子比較經典。見代碼:
function constfuncs(){
var funcs=[];
for(var i=0;i<10;i++){
funcs[i]=function{ return i ; }
}
return funcs;
}
var funcs=constfuncs();
funcs[5]()
此時,結果的返回值是10;
結合上面的概念一步一步分析:
首先,constfuncs()函數執行之後獲得的是funcs數組,數組中是十個未執行的函數function(){return i}。當調用funcs[5]()的時候,變量i的值應該是函數在定義的時候i的取值,又由於直到i=10的時候循環才中止,因此,最後i的取值是10.函數調用返回值也是10。
從這裏不能看出:關聯到閉包的做用域鏈是「活動的」。嵌套函數不會將做用域內的私有成員複製一份,也不會對所綁定的變量生成靜態快照。