函數閉包
- 函數就是閉包,當一個函數被創建時,它的內部的語句、變量、函數等,共同形成了閉包。
這里簡單分析下閉包函數執行調用過程
function outer(){
var a = 12;
//形成閉包環境中的變量不是一成不變的,可以被更改
function inner(){
console.log(a ++);
}
return inner;
}
var inn = outer();
inn();
inn();
閉包的用途:
可以在函數外部讀取函數內部成員
讓函數內成員始終存活在內存中
閉包存在的問題
//閉包的問題
var arr = [];
for(var i = 0;i <= 10;i ++){
arr[i] = function (){
console.log(i);
}
}
//應該是輸出對應下標
arr[0]();//11
arr[1]();//11
arr[2]();//11</pre>
這個代碼只是想實現根據arr下標,console.log出相應的值。但是當調用時,for循環中的i已經執行完了,i = 11。i的作用域太大了,執行時,i的結果就已經執行完了。
解決方法就是形成一個閉包,將i的作用域從全局縮小變成局部作用域,arr[i]()
每執行一次,i的值就執行一次,使i的值依舊可以使用。
//解決
var arr = [];
for (var i = 0; i <= 10; i++) {
//自調用函數
(function (i){
arr[i] = function () {
console.log(i);
}
})(i);
}
//應該是輸出對應下標
arr[0]();//0
arr[1]();//1
arr[2]();//2