JavaScript Closures and setTimeout

后端 未结 2 554
长发绾君心
长发绾君心 2021-01-20 02:33

Closures are something I still don\'t fully grasp in JS. I think this is a closure issue. I\'m trying to create a progress bar. Every x seconds I want to increment the width

相关标签:
2条回答
  • 2021-01-20 02:45

    Instead of using setTimeout you want to use setInterval. The latter will call the function once per interval instead of just once.

    var width = 50
    setInternal(function () {
      myDiv.style.width = width
      width++
      }, timeIncrement * 1000);
    

    Additionally at some point you'll probably want to end the interval and stop incrementing the size. For that you'll need to call clearInterval on the result of setInterval

    var width = 50
    var t = setInterval(function () {
      myDiv.style.width = width
      width++
      if (doneIncrementing) {
        clearInterval(t);
      }
      }, timeIncrement * 1000);
    
    0 讨论(0)
  • 2021-01-20 03:08

    The thing is that you're incrementing a timeIncrement inside closure. So effectively you do not increment it at all until first timeout happens. Here is the changed code:

    for(i=0;i<=counter;i++){
        setTimeout(function (){
            myDiv.style.width = wIncrement+"px"
            wIncrement++;
        }, i*1000);
    }
    

    You still might have issues with wIncrement variable. Also I would use setInterval instead of setTimeout for this reason.

    0 讨论(0)
提交回复
热议问题