猿问

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


慕村225694
浏览 532回答 1
1回答

汪汪一只猫

你的第一个种写法,其实是立即执行函数,实际效果直接写console.log(i)是一样的,因此会立即执行,因为是匿名函数,所以执行完之后立即销毁。所以导致setTimeout里的第一个参数变成了undefiend,所以setTimrout不会执行,最终你看到的就是立即输出0-9而第二种写法则是运用了闭包,所以会保存调用环境,因此可以每2s打印一次。Update:&nbsp;稍微更改了下叙述,便于理解。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答