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: 稍微更改了下叙述,便于理解。
添加回答
举报
0/150
提交
取消
