Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 java脚本Foreach循环_Javascript_Loops_Foreach - Fatal编程技术网

Javascript java脚本Foreach循环

Javascript java脚本Foreach循环,javascript,loops,foreach,Javascript,Loops,Foreach,Javascript function myFunction() { for (i = 0; i < 5000;) { setTimeout(function() { document.getElementById("demo").innerHTML = i; }, i); i += 500; } } 函数myFunction(){ 对于(i=0;i

Javascript

function myFunction() {
  for (i = 0; i < 5000;) {
    setTimeout(function() {
      document.getElementById("demo").innerHTML = i;
    }, i);
    i += 500;
  }
}
函数myFunction(){
对于(i=0;i<5000;){
setTimeout(函数(){
document.getElementById(“demo”).innerHTML=i;
},i);
i+=500;
}
}
HTML

<body onload="myFunction()">
    <div id="demo"></div>

如何每5毫秒增加一次“i”,并在每次更改时在演示中打印它

我正在尝试每5毫秒增加一次(I)的值,并在演示中打印出来

现在,由于某种原因,只要我运行脚本,值5000就会立即打印出来,而不是每次增加500


提前谢谢

您可以将
myFunction
更改为:

var i = 0;

function myFunction() {
    var timerId = setInterval(function(){ 
        if(i >= 5000)
        {
            clearInterval(timerId);
        }

        document.getElementById("demo").innerHTML = i;
        i +=500;
    }, 5);
}
这应该行得通

var i=0;

function looper(){
    setTimeout(function(){ 
console.log(i+" data");
i=i+500;
if(i<5000)
looper();
}, i);
}

looper();
var i=0;
函数活套(){
setTimeout(函数(){
console.log(i+“数据”);
i=i+500;
如果(i)

Plunkr:

您遇到了闭包未保存超时引用的问题。第二个参数之后的后续参数将作为参数传递到回调函数中

这里我们传递
i
作为第三个参数

setTimeout(fn, delay, i)
然后在callaback中,我们可以访问
i
,我们将其重新分配到回调范围内的
x

函数myFunction(){

对于(i=0;i如果您希望您的代码看起来与现有代码相似,可以使用iLife:

函数myFunction(){
对于(i=0;i**


函数myFunction(){
var i=0;
var setClock=函数(){
如果(i<5000){
局部=i;
i+=500;
setTimeout(function(){document.getElementById(“demo”).innerHTML=local;setTimeout(setClock,500);},
500);
}
}
设置时钟();
}
**

  • 您应该将脚本包装在标记中
  • javascript闭包。您应该知道,由于闭包,所有setTimeout()的第二个参数都是5000,这是i的最终值。您可以通过我显示的代码避免闭包,或者通过以下代码消除闭包的影响:
  • 
    函数myFunction(){
    局部变量;
    对于(i=0;i<5000;i+=500){
    局部=i;
    setTimeout((函数(间隔){
    返回函数(){document.getElementById(“demo”).innerHTML=interval;};
    })(局部),(函数(区间){返回区间}(局部));
    }
    }
    

    你的代码不清晰谢谢,我现在已经修复了。还有更好的吗?谢谢你的帮助,每个人都没有在每次我增加时打印出来:(如何停止循环?对于foreach,我可以说I>=5000@mark
    if(i<5000){looper();}
    ,在
    setTimeout
    内部。但这个答案不正确。超时是
    i
    ,应该是5ms。增量是
    5
    ,应该是
    500
    。并且没有条件像上面所说的那样停止循环。@Arg0n谢谢,我已经更新了它。&yes mark在方法调用自身的地方设置了任何条件,根据您的需要。谢谢您的帮助:)刚发现这实际上并不是在i值增加500毫秒时打印出i值。它只是打印x值,这是iI的一个独立计时器。我不明白你的意思。你想实现什么?谢谢你的帮助,但我需要每500毫秒增加一次类似的值。我现在得到了答案:)谢谢again@mark然后你可能应该将你的问题中的
    如何每5毫秒增加一次“i”
    改为
    如何每500毫秒增加一次“i”
    。我已经更新了答案。事实上,答案在你的问题中有两处。
    …每5毫秒(i)一次的值…
    setTimeout(fn, delay, i)
    
    <div id="demo"></div>
    <script>
    function myFunction() {
            var i = 0;
            var setClock = function() {
                if (i < 5000) {
                    local = i;
                    i += 500;
    
                setTimeout(function() {document.getElementById("demo").innerHTML = local; setTimeout(setClock, 500);},
                    500);
                }
            }
            setClock();
        }
    
    <div id="demo"></div>
    <script>
    function myFunction() {
            var local;
            for (i = 0; i < 5000; i+= 500) {
                local = i;
                setTimeout((function(interval){
                    return function() {document.getElementById("demo").innerHTML = interval;} ;
                })(local), (function(interval){return interval})(local));
            }
    }