js閉包概念
含義:閉包是一個概念,它描述了函數執行完畢內存釋放後,依然內存駐留的一個現象,只要把握這個核心概念,閉包就不難理解了
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的值。
閉包的概念:函數對象可以通過作用域鏈相互關聯起來,函數體內的變量可以保存在函數作用域內,這種特性被稱為閉包。
var scope=‘global scope‘;
function checkscope(){
var scope="local scope";
function f(){ return scope; }
return f;
}
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。
從這裏不能看出:關聯到閉包的作用域鏈是“活動的”。嵌套函數不會將作用域內的私有成員復制一份,也不會對所綁定的變量生成靜態快照。
js閉包概念