JavaScript閉包 1、什麼是閉包 百度百科對於閉包的解釋是:閉包是指可以包含自由(未綁定到特定對象)變數的代碼塊;這些變數不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變數)。 以代碼進行闡釋: 這樣在執行完var c=a()後,變數c實際上是指向了函數b, ...
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。
由知道借鑒,互相參考,共同學習。