JavaScript閉包
1、什么是閉包
百度百科對於閉包的解釋是:閉包是指可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量)。
以代碼進行闡釋:
function a(){ //建立函數a var i=0; //定義變量i function b(){ //在函數a內套入函數b alert(++i); //提示框,輸出i的值 } return b; //返回函數b的值 } var c = a(); //將函數a賦給變量c c(); //輸出c
這樣在執行完var c=a()后,變量c實際上是指向了函數b,再執行c()后就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實就創建了一個閉包,為什么?因為函數a外的變量c引用了函數a內的函數b,就是說:當函數a的內部函數b被函數a外的一個變量引用的時候,就創建了一個閉包。
2、閉包的作用
以以上函數為例,閉包的作用就是在a執行完並返回后,閉包使得Javascript的垃圾回收機制GC(垃圾回收機制)不會收回a所占用的資源,因為a的內部函數b的執行需要依賴a中的變量,由於閉包的存在使得函數a返回后,a中的i始終存在,這樣每次執行c(),i都是自加1后alert出i的值。那么我們來想象另一種情況,如果a返回的不是函數b,情況就完全不同了。因為a執行完后,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引 用,因此函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被GC回收。
3、閉包的應用場景
- 保護函數內的變量安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。
- 在內存中維持一個變量。依然如前例,由於閉包,函數a中i的一直存在於內存中,因此每次執行c(),都會給i自加1。
由知道借鑒,互相參考,共同學習。