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

for-循环中的setTimeout不打印连续值

for-循环中的setTimeout不打印连续值

慕村9548890 2019-05-31 10:44:28
for-循环中的setTimeout不打印连续值我有一个剧本:for (var i = 1; i <= 2; i++) {     setTimeout(function() { alert(i) }, 100);}但3两次都发出警报,而不是1然后2.有没有办法通过i,而不将函数写入字符串?
查看完整描述

3 回答

?
MMMHUHU

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

可以使用立即调用的函数表达式(生命)在周围创建一个闭包setTimeout:


for (var i = 1; i <= 3; i++) {

    (function(index) {

        setTimeout(function() { alert(index); }, i * 1000);

    })(i);

}


查看完整回答
反对 回复 2019-05-31
?
LEATH

TA贡献1936条经验 获得超6个赞

这是因为!

  1. 这个

    超时

    函数回调在循环完成后都运行良好。事实上,作为计时器,即使每次迭代都是setTimeout(.,0),所有这些函数回调仍将在循环完成后严格运行,这就是为什么3被反映出来的原因!
  2. 所有这两个函数,尽管它们是在每个循环迭代中分别定义的,但在

    相同的共享全局范围

    事实上,只有一个我在里面。

这个通过使用已执行的自函数(匿名函数或更多)来声明每个迭代的单个作用域。生命)并有一份i在里面,就像这样:

for (var i = 1; i <= 2; i++) {

     (function(){

         var j = i;
         setTimeout(function() { console.log(j) }, 100);

     })();}

清洁工会是

for (var i = 1; i <= 2; i++) {

     (function(i){ 

         setTimeout(function() { console.log(i) }, 100);

     })(i);}

使用生命(自执行函数)在每个迭代中为每个迭代创建了一个新的范围,这为我们的超时值函数回调每个迭代提供了关闭一个新范围的机会,这个范围中有一个变量,其中的每个迭代值都是正确的,我们可以访问它。


查看完整回答
反对 回复 2019-05-31
  • 3 回答
  • 0 关注
  • 487 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信