在學(xué)習(xí)js的閉包問題的時(shí)候,js高級(jí)程序設(shè)計(jì)上的代碼例子,我敲了實(shí)驗(yàn)了下結(jié)果并不相符,想不明白。
function createFunction(){
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function(){
// console.log(i);
return i;
};
}
return result;
}
這個(gè)代碼結(jié)果應(yīng)該返回的是一個(gè)數(shù)組,每個(gè)值都是10,可是在瀏覽器中實(shí)驗(yàn)后,我發(fā)現(xiàn)返回的是一個(gè)函數(shù)數(shù)組。
求解為什么不是返回一個(gè)數(shù)值數(shù)組?
是一個(gè)函數(shù)數(shù)組,每個(gè)函數(shù)雖然都有返回值 i ,不過這個(gè)函數(shù)并沒有執(zhí)行。
你仔細(xì)看書的 181 頁,代碼下面第一句話。
這個(gè)函數(shù)會(huì)返回一個(gè)函數(shù)數(shù)組。
之前我看到這兒的時(shí)候也有一點(diǎn)疑惑,感覺應(yīng)該直接全部返回 10 才更直觀。后來想了想,如果直接在返回的函數(shù)后面加()執(zhí)行的話,就相當(dāng)于每次都創(chuàng)建一個(gè)立即執(zhí)行函數(shù),返回的 i 就是每次正常的索引值,起不到該有的效果。
function createFunction(){
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = function(){
return i;
}();
}
return result;
}
createFunction() //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
因?yàn)槟阒皇前押瘮?shù)賦給數(shù)組元素,并沒有調(diào)用這些函數(shù)。
function createFunction(){
var result = new Array();
for (var i = 0; i < 10; i++) {
result[i] = (function(){
return i;
})();
}
return result;
}
result 作為數(shù)組,其元素是函數(shù)。
所以就會(huì)有你這個(gè)情況
如果想要得到你想要的全部是 10
,只需要遍歷這個(gè)數(shù)組并調(diào)用作為數(shù)組元素的函數(shù),把返回值 log 出來
createFunction().forEach(fn => console.log(fn()));