在學(xué)習(xí)js的閉包問題的時(shí)候,js高階程式設(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ù)組元素,並沒有??呼叫這些函數(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()));