Maison  >  Questions et réponses  >  le corps du texte

javascript - js实现for循环1-10, 延迟500ms展示结果, 但结果总是错误的, 求办法

描述如题

代码如下

function test() {
  for(var i=0; i<10; i++) {
    setTimeout(function(){
      (function (m) {
        console.log(m);
      })(i)
    }, 500)
  }
}
test();

执行结果

请教下解决办法, 并指出错误位置, 谢谢!

PHP中文网PHP中文网2749 Il y a quelques jours1130

répondre à tous(15)je répondrai

  • PHP中文网

    PHP中文网2017-04-11 12:07:17

    错的原因是对JS变量提升的概念理解不透彻

    function test() {
      for(var i=0; i<10; i++) {
        setTimeout(function(){
          (function (m) {
            console.log(m);
          })(i)
        }, 500)
      }
    }
    test();

    换成let就好,每次循环都创建一个块级作用域

    répondre
    0
  • 迷茫

    迷茫2017-04-11 12:07:17

    用递归来代替循环

    function delayLoop(factory, time, count, _i = 0, _timer = []) {
        if(_i >= count) return _timer
        var timer = setTimeout(() => {
            _timer[_i] = undefined
            factory(_i)
            _i ++
            delay(factory, time, count, _i, _timer)
        }, time)
        _timer.push(timer)
        return _timer
    }
    
    // usage
    var count = 10
    var interval = 1000
    var timer = delayLoop((i) => {
      console.log(i)
    }, interval, count)
    // stop
    setTimeout(() => timer.filter(item => !!item).forEach(t => clearTimeout(t)), 3200)
    

    répondre
    0
  • 黄舟

    黄舟2017-04-11 12:07:17

    错误原因和这篇文章一样 https://segmentfault.com/a/11...

    répondre
    0
  • 黄舟

    黄舟2017-04-11 12:07:17

    for(let i = 0; i < 10; i++) {
        setTimeout(function(){
            console.log(i)
        },500)
    }
    

    最好的办法就是直接用let就好了

    而下边这种写法

    function test() {
      for(var i=1; i<11; i++) {
        setTimeout((function(){
            console.log(i);
        })(), 500)
      }
    }
    

    相当于

    function test() {
      for(var i=1; i<11; i++) {
        setTimeout(console.log(i), 500)
      }
    }

    是不会有延时的。

    除非:

    function test() {
      for(var i=1; i<11; i++) {
        setTimeout((function(i){
            return function() {
                console.log(i);
            } 
        })(i), 500)
      }
    }

    明白了了吧,但是还是用let吧,骚年!

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-11 12:07:17

    错误原因和这篇文章一样 https://segmentfault.com/a/11...

    répondre
    0
  • Annulerrépondre