循环延时输出0,1,2,3,4

222 阅读1分钟

原题:

for(var i = 0; i < 5; i++){

setTimeout(()=>{

console.log(i)

}, i*1000)

}

结果是依次会输出5个5;但是一般我们希望得到的结果是依次输出 0,1,2,3,4

我总结了以下3种解法:

1,es6变量声明

至于var 和let的区别,大家应该都知道,这时候将循环变量使用的声明var 改成 let ,就可以正常得到我们希望的结果

2,闭包

将setTimeout 的延时回调改成这样:

setTimeout(((i)=>{

return ()=>{

console.log(i)

}

})(i), i*1000)

3,bind函数

setTimeout(((i)=>{

console.log(i)

}).bind(i), i*1000)

利用bind将回调变成预设参数的函数


如果还有其他解法,望补充。