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

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

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
阅读 2.5k
2 个回答
✓ 已被采纳

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

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

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

看这个问题,我想或许去了解一下 JS 中的变量作用域的相关问题就可以了。

要不参考一下这个,学习一下,或许有帮助 https://zhuanlan.zhihu.com/p/590650432

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏