setTimeout问题


    for(var i=0;i<10;i++){
        setTimeout((function(i){
            console.log(i)
        })(i),2000*i)
    }

这样写一个立即执行函数,会0秒打印出0~9,为何2000*i这个没有生效?但是里面的i确实变了啊。for循环时,难道是setTimeout(fun,0)?我把时间设置为10s,也是立即打印的,为什么?


    for(var i=0;i<10;i++){
        setTimeout((function(i){
            return function(){
                console.log(i)
            }
        })(i),2000*i)
    }

我这样写结果是对了,每隔2s打印i,整个函数的执行流程是怎么样的,我的理解如下

  1. 执行for循环时,立即绑定10个


    setTimeout((function(){})(0),0)~setTimeout((function(){})(9),9)
  1. 然后0秒执行第一个setTimeout

阅读 2.6k
2 个回答

你的第一个种写法,其实是立即执行函数,实际效果直接写console.log(i)是一样的,因此会立即执行,因为是匿名函数,所以执行完之后立即销毁。所以导致setTimeout里的第一个参数变成了undefiend,所以setTimrout不会执行,最终你看到的就是立即输出0-9
而第二种写法则是运用了闭包,所以会保存调用环境,因此可以每2s打印一次。

Update: 稍微更改了下叙述,便于理解。

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