Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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 如何在for循环中使用setInterval函数_Javascript_For Loop_Closures_Setinterval - Fatal编程技术网

Javascript 如何在for循环中使用setInterval函数

Javascript 如何在for循环中使用setInterval函数,javascript,for-loop,closures,setinterval,Javascript,For Loop,Closures,Setinterval,我正在尝试运行多个计时器,给出一个可变的项目列表。代码如下所示: var list = Array(...); for(var x in list){ setInterval(function(){ list[x] += 10; console.log(x + "=>" + list[x] + "\n"); }, 5 * 1000); } 上述代码的问题在于,唯一更新的值是列表末尾的项目乘以列表中的项目数 有谁能提供一个解决方案和一些解释

我正在尝试运行多个计时器,给出一个可变的项目列表。代码如下所示:

var list = Array(...);

for(var x in list){
    setInterval(function(){
        list[x] += 10;
        console.log(x + "=>" + list[x] + "\n");
    }, 5 * 1000);
}
上述代码的问题在于,唯一更新的值是列表末尾的项目乘以列表中的项目数

有谁能提供一个解决方案和一些解释,让我知道它为什么会这样吗?

所以,有几件事:

  • 最重要的是,传递给
    setInterval()
    的回调函数维护对
    x
    的引用,而不是在每个特定迭代过程中存在的
    x
    的快照值。因此,当
    x
    在循环中更改时,它也会在每个回调函数中更新
  • 此外,用于枚举对象属性,在数组上使用时可以
  • 更重要的是,我怀疑你真的想要而不是
  • 通过向
    setTimout()
    提供附加参数,可以将参数传递给回调函数:

    var timeoutID=window.setTimeout(func,delay,[param1,param2,…)
    数字将按值传递,而不是按引用传递。下面是一个例子:

    var列表=[1,2,3,4];
    对于(变量x=0,ln=list.length;x%d”,y,list[y]+=10);
    },x*500,x);//我们经过了x
    }
    var列表=[1,2,3,4,5];
    对于(变量i=0,len=list.length;i”+列表[i]+“\n”);
    }, 5000)
    })(i) );
    
    }
    您不必在
    setInterval
    语句中使用for循环。试试这个:

    var list = Array(...);
    var x = 0;
    
    setInterval(function() {
    
        if (x < list.length;) {
            list[x] += 10;
            console.log(x+"=>"+list[x]);
        }
    
        else return;
    
        x++;
    }, 5000);
    
    var list=Array(…);
    var x=0;
    setInterval(函数(){
    if(x”+列表[x]);
    }
    否则返回;
    x++;
    }, 5000);
    
    如果包含JSON数组和jQuery,则可以使用:

    $.each(jsonArray, function(i, obj) {
        setInterval( function() {
            console.log(i+' '+obj);
        }, 10);
    });
    

    我不知道如何使用for循环执行此操作,但这里的代码将以定时间隔打印出数组中的每个元素:

    function displayText(str) {
       $('.demo').append($('<div>').text(str));
    }
    var i = 0;
    
    var a = [12, 3, 45, 6, 7, 10];
    
    function timedLoop() {
    setTimeout(function () {
        displayText(a[i]);
        i++;
        if(i < a.length) {
            timedLoop();
        }
    }, 2000)
    }
    
    timedLoop();
    
    函数显示文本(str){
    $('.demo').append($('.text(str));
    }
    var i=0;
    VarA=[12,3,45,6,7,10];
    函数timedLoop(){
    setTimeout(函数(){
    显示文本(a[i]);
    i++;
    如果(i

    使用一点jquery在浏览器中显示它

    您可以将
    forEach
    setTimeout
    组合在一起,以间隔在数组上循环

    let模式=[1,2,3,4,5,6,7,8,9,10];
    设间隔=1000//一秒钟
    模式。forEach((模式,索引)=>{
    设置超时(()=>{
    console.log(模式)
    },索引*间隔)
    
    })
    是的,我建议您阅读这篇文章:。然而,最重要的是,循环中的setTimeout可能不是他想要做的事情,因为所有回调都将在同一时间触发,它们不会交错。OP不需要“闭包”,相反,它需要避免对x的闭包(你的答案实际上是这样的)。它保持关闭列表虽然。优秀的解决方案!一个小提示:任何可以在循环中更改的内容都可以传递给匿名函数,而不仅仅是索引。
    function displayText(str) {
       $('.demo').append($('<div>').text(str));
    }
    var i = 0;
    
    var a = [12, 3, 45, 6, 7, 10];
    
    function timedLoop() {
    setTimeout(function () {
        displayText(a[i]);
        i++;
        if(i < a.length) {
            timedLoop();
        }
    }, 2000)
    }
    
    timedLoop();