var?funcs=[];
for(var?i=0;i<10;i++){???
????(function(i)?{
????????funcs.push(function(){console.log(i)})???
????})(i);
}
funcs.forEach(function(func){???func()?})
二、
var?funcs=[];
function?pushFun(i)?{
????funcs.push(function()?{?console.log(i)?})
}
for(var?i=0;i<10;i++){
????pushFun(i);
}
funcs.forEach(function(func){???func()?})
三、
var?funcs=[];
function?logIndex(i)?{
????return?function()?{
????????console.log(i);
????}
}
for(var?i=0;i<10;i++){
????funcs.push(logIndex(i));
}
funcs.forEach(function(func){???func()?})
首先,你要先理解為什么不用let就不能輸出0-9,或者說為什么需要let才能輸出0-9;知道了根本問題才有辦法去解決。
方案一應(yīng)該是網(wǎng)上最多提到的方式,就是使用一個IIFE來將讓變量有類似let一樣的塊級作用域的效果,因為ES6之前也就是ES5,JS只有全局作用域和函數(shù)作用域,一旦你的函數(shù)中有i這個變量,那么實際上console.log打印出的i是當時傳入該函數(shù)中的值,就不再是外部for循環(huán)最后的值了。
方案二不過是方案一的變種,理論上是一個東西,把IIFE抽出去變成一個顯式的函數(shù)調(diào)用,同樣把值傳進去即可。
方案三說白了也一樣,不過是在寫法上靠近函數(shù)式而已。本質(zhì)還是跟之前差不多。