閉包、for迴圈和立即執行函式
阿新 • • 發佈:2019-02-16
閉包與變數
作用域鏈的一個副作用:閉包只能取得包含函式中任何變數的最後一個值。
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result;
}
①createFunctions()函式,將10個閉包賦值給陣列result,再返回result陣列。每個閉包都返回自己的索引,但實際上都返回10。
因為每個函式(閉包)的作用域鏈中都儲存著createFunctions()函式的活動物件,所以它們引用的是同一個變數i,當createFunctions函式執行完後i的值10,故閉包中的i也都為10。
②解決辦法,不使用閉包,建立一個匿名函式,將i值賦值給其引數:
複製程式碼程式碼如下:
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(num){
return function(){
return num;
};
}(i);
}
return result;
}
建立一個每次迴圈都會執行一次的匿名函式:將每次迴圈時包圍函式的i值作為引數,存入匿名函式中。因為函式引數是按值傳遞的,而非引用,所以每個匿名函式中的num值 都為每此迴圈時i值的一個副本。
--------------------------------------------------------------------
因為每個函式(閉包)的作用域鏈中都儲存著createFunction()函式的活動物件,所以它們引用的是同一個變數i,這句話是重點。