for循环中setTimeout打印结果不同的原因是什么?

作者站长头像
站长
· 阅读数 21

下面三段代码的输出结果不同,前端初学者想请问一下背后的原因是什么(学不明白)

for(var i = 0;i < 3;++i){
    setTimeout((i) => {
        console.log(i)
    },0);
}
// 输出 undefined undefined undefined

for(var i = 0;i < 3;++i){
    setTimeout(function (){
        console.log(i)
    },0);
}
// 输出 3 3 3

for(var i = 0;i < 3;++i){
    setTimeout(
        console.log(i),0);
}
// 输出 1 2 3
回复
1个回答
avatar
test
2024-06-27

第一段代码因为声明了形参变量i,所以函数内拿不到外层作用域的i变量,函数在被调用时又没有传值,所以值是 undefined。setTimeout 可以通过第三个及以后的参数为调用函数传值:

setTimeout((i)=>{
    console.log(i)
},0,1)

第二段代码因为 var 没有块作用域。第三段代码直接调用了函数,setTimeout 没有任何作用。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容