javascript - 怎样解决定时器里i的问题
PHPz
PHPz 2017-04-11 13:21:57
0
4
259

这段代码如果不加封闭空间(被注释部分),一直弹6,加了封闭空间就没有规律的乱弹了,哪位大神能帮忙解决一下定时器里i的问题(换成timeout也是不好使的),让他在定时器里面弹出0,1,2,3,4,5,

PHPz
PHPz

学习是最好的投资!

répondre à tous (4)
Peter_Zhu

不加闭包,引用的都是同一个i,自然都是6。

后面那个很有趣,当你不是用alert显示i,而是用log显示i时,它必然是有序的,这说明回调是按顺序压入执行线程的,所以alert的乱序和setTimeout或者setInterval本身没关系。

那为什么会乱序呢?这是因为alert会打断程序的执行,阻塞执行线程,会导致setTimeout和setInterval的结果具有不确定性,自然就不能保证顺序。

所以结论是,不要用alert。

    黄舟

    你要什么效果?问题不明确啊,直接输出0,1,2,3,4,5这种?如果是这样的话,那么应该使用setTimeOut

      巴扎黑

      没规律的乱弹,是因为所有的6个闭包函数几乎同时执行,然后每隔300ms再次执行,循环往复……
      所以在浏览器上执行结果是看不出来任何顺序。

      改成setTimeout是可以达到你的目的的。

      for (var i=0; i<6; i++) { (function(j) { setTimeout(function() { console.log(j); }, j*1000); })(i); }
        黄舟

        不想用闭包的话,直接用es6的let吧。

          Derniers téléchargements
          Plus>
          effets Web
          Code source du site Web
          Matériel du site Web
          Modèle frontal
          À propos de nous Clause de non-responsabilité Sitemap
          Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!