let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
如上javascript代码,执行的结果是6个6,为什么会是这样呢?
javascript是一门单线程的语言,每一次调用setTimeout这个函数,传递过来的回调函数并不会在主线程上立即执行,而是会放到事件循环队列中,等待主线程都执行完,当for循环执行完之后(此时i为6),主线程上执行完毕,才会执行回调函数,因此打印出6个6。
- 如何让代码打印出0,1,2,3,4,5呢
阮一峰es6中有相类是的问题(let的例子)
es6.ruanyifeng.com/#docs/let, 使用
let可以很好的解决这个问题,在每一次执行for循环的时候,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
另外一种是使用立即执行函数,将参数传递进去
let i = 0
for(i = 0; i<6; i++){
!function(j){
setTimeout(()=>{
console.log(j)
},0)
}(i)
}