Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript闭包和setTimeout_Javascript_Closures_Settimeout - Fatal编程技术网

JavaScript闭包和setTimeout

JavaScript闭包和setTimeout,javascript,closures,settimeout,Javascript,Closures,Settimeout,闭包是我在JS中还没有完全掌握的东西。我认为这是一个结束问题。我正在尝试创建一个进度条。每x秒我想增加一个DIV的宽度。下面是应该做的部分: for(i=0;i<=counter;i++){ setTimeout(function (){ myDiv.style.width = wIncrement+"px" timeIncrement++; wIncrement++; },timeIncrement*1000); } fo

闭包是我在JS中还没有完全掌握的东西。我认为这是一个结束问题。我正在尝试创建一个进度条。每x秒我想增加一个DIV的宽度。下面是应该做的部分:

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

for(i=0;i而不是使用
setTimeout
您希望使用
setInterval
。后者将每个间隔调用函数一次,而不是仅调用一次

var width = 50
setInternal(function () {
  myDiv.style.width = width
  width++
  }, timeIncrement * 1000);
此外,在某个时刻,您可能希望结束间隔并停止增加大小。为此,您需要对
setInterval
的结果调用
clearInterval

var width = 50
var t = setInterval(function () {
  myDiv.style.width = width
  width++
  if (doneIncrementing) {
    clearInterval(t);
  }
  }, timeIncrement * 1000);

问题是,您在闭包中增加了一个
timeIncrement
。因此,在第一次超时发生之前,实际上根本不会增加它。下面是更改后的代码:

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

用于(i=0;i@mVChr我也这么认为,但他们没有提到它应该永远完成。我会用一个答案来更新,证明这一点。当我运行后者时,我得到的setInternal没有定义。@DA这是因为我不会拼写。它应该是
setInterval
,而不是
setInternal
。我已经更正了我的答案啊!所以我必须使用用于增加超时的变量(而不是内部变量)。这很有效!谢谢!