立即執行函數在執行前進行預編譯時,也會生成一個AO。可利用此特性,儲存循環過程中的變量,以便循環結束後使用這個變量。
案例:
需求:編寫一個長度為10的數組,儲存10個函數,這些函數的功能依次是在控制台輸出0,2..,9.
思路:使用for循環往數組裡添加函數
原理:閉包可以封裝變量
錯誤寫法:
<script type="text/javascript">
function test(){
var arr = [];
for(var i = 0;i < 10 ;i++){
arr[i] = function(){
console.log(i);
}
}
return arr;
}
var myArr = test();
myArr[0]();
myArr[1]();
myArr[2]();
myArr[3]();
myArr[4]();
</script>
這樣寫數組裡面的函數和test形成閉包,輸出結果是5個10,因為test函數執行結束,i的值變成了10,當調用myArr[0]時,console.log(i);通路的i值是10,其它也都是10
正确寫法:
<script type="text/javascript">
function test(){
var arr = [];
for(var i = 0;i < 10 ;i++){
(function(j){
arr[j] = function(){
console.log(j);
}
}(i))
}
return arr;
}
var myArr = test();
myArr[0]();
myArr[1]();
myArr[2]();
myArr[3]();
myArr[4]();
</script>
每個立即執行函數都有一個獨立的AO,調用myArr[0]和myArr[5]通路的j位于不同的AO中,如下圖所示
