为了账号安全,请及时绑定邮箱和手机立即绑定

setTimeout问题

setTimeout问题

慕村225694 2018-10-11 14:13:32
    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,整个函数的执行流程是怎么样的,我的理解如下执行for循环时,立即绑定10个     setTimeout((function(){})(0),0)~setTimeout((function(){})(9),9)然后0秒执行第一个setTimeout
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2018-11-29
  • 1 回答
  • 0 关注
  • 531 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号