Javascript Can';我睡不着

Javascript Can';我睡不着,javascript,loops,delay,sleep,Javascript,Loops,Delay,Sleep,我想暂停1秒对于每次循环,在其他情况下进行类似暂停通常很容易,但在处理循环时,似乎会变得更难: for (var i=0 ; i < 10 ; i++) { document.write (i + "<br>"); // I want to wait 1 second here } for(变量i=0;i

我想暂停
1秒
对于每次循环,在其他情况下进行类似暂停通常很容易,但在处理循环时,似乎会变得更难:

for (var i=0 ; i < 10 ; i++) {
    document.write (i + "<br>");
    // I want to wait 1 second here
}
for(变量i=0;i<10;i++){
document.write(i+“
”); //我想在这里等一秒钟 }
这是我数千次失败尝试的一个例子:

function writeMsg (index) {
    document.write (index + "<br>");
}

for (var i=0 ; i < 10 ; i++) {
    setTimeout (writeMsg(i), 1000);
}
函数writeMsg(索引){
document.write(索引+“
”); } 对于(变量i=0;i<10;i++){ 设置超时(writeMsg(i),1000); }

您知道如何使其工作吗?

您将函数调用的返回值传递给
setTimeout
,而不是函数。请尝试以下代码:

for (var i = 0; i < 10; i++) {
    (function(i) {
        setTimeout(function() {
            writeMsg(i);
        }, 1000*i);
    })(i);
}
for(变量i=0;i<10;i++){
(职能(一){
setTimeout(函数(){
书面SG(i);
},1000*i);
})(i) );
}

如果您想知道为什么调用被包装在匿名函数中:如果没有该函数,每个setTimeout回调将接收相同的
i
,因此当回调启动时,它将始终是
10
。匿名函数在内部创建一个新的
i
,该函数未连接到循环变量。

经典的循环函数问题。一个典型的解决方案:

function createCallback(i) {
    return function () {
        writeMsg(i);
    };
}

function writeMsg (index) {
    document.write (index + "<br>");
}

for (var i=0 ; i < 10 ; i++) {
    setTimeout (createCallback(i), 1000*i);
}
函数createCallback(i){
返回函数(){
书面SG(i);
};
}
函数writeMsg(索引){
document.write(索引+“
”); } 对于(变量i=0;i<10;i++){ 设置超时(createCallback(i),1000*i); }
这10个超时都基于调用setTimeout()的时间。因此,它们都是同时触发的

for (var i=0; i < 10; i++) {
    (function(idx){
        setTimeout(function(){
            document.write(idx+"<br/>");
        },1000*idx);
    })(i);
};
for(变量i=0;i<10;i++){
(功能(idx){
setTimeout(函数(){
文件。写入(idx+“
”); },1000*idx); })(i) ); };
此函数的工作原理更像普通的for循环,而它不是

您需要考虑到for在分号之间有3个参数

  • 开始之前(即定义变量)
  • 再次运行代码之前的条件(即当i小于10时,i
    i<10
  • 每次它再次完成代码时的操作(
    i++
    addone to i)
  • 代码

    (函数(){
    //定义一个变量
    var i=0,
    动作=函数(){
    //重新运行的条件
    如果(i<10){
    文件。写(i+“
    ”); //给我加一个 i++; 设置超时(操作,1000); } }; 设置超时(操作,1000); })();
    下面是此代码的JSFIDLE,演示其工作原理:

    试试这个,它肯定会帮助所有人思考如何让它在For循环中工作等待属性。。。 请在此URL中尝试此代码

    var-var2;
    var-tmp;
    var-evt;
    var i=0;
    var res=document.getElementsByClassName('mar-plp-filter-content-nav-stacked')[0].children.length;
    tmp=document.getElementsByClassName('mar-plp-filter-content-nav-stacked')[0]。子项;
    函数myfunc()
    {
    
    如果(它们同时打印)(铬)是的,我忘记了
    1000*i
    而不是
    1000
    。你可能复制了初始版本。它每次都打印
    10
    。但是我可以通过一些修改让它工作。现在试试。这两个功能混在一起只会启动x个超时量,而这对小数字有效。如果你尝试启动太晚,那将是地狱ny。这也忽略了通过将i设置为大于10来中途中断for循环的可能性。在我看来,这是一种非常可怕的方式。哦,把parens搞砸了。这就是为什么我喜欢单独的回调生成器——更容易编写,更容易阅读。糟糕的做法是,启动多个超时并中断正常的for func因为你不能改变i来影响代码的其他潜在循环。@sg3s请原谅?你的评论不清楚。我不能说我听说过调度
    O(10)
    超时会导致问题。这是一种不好的做法。OP不只是想向文档中写入消息,而且显然会一次又一次地执行多个或相同的操作。这样做不会让你在开始所有超时后进行干预,因为这是开始,而他可能会在循环5中决定这已经足够了,由于w/e原因,然后将i设置为10…他要求一个for循环,每个循环都会延迟。无法使用不同的变量启动函数x y多次,也无法停止它们将执行的操作。和的可能重复大约10万次。实际上,他的主要问题是调用
    writeMsg(i)
    立即将函数传递给setTimeout…@MΓΓΓБLL令人惊讶的是,虽然不是很多人都能得到正确的答案:s…这样做不好,您启动多个超时并打破功能正常,因为您无法通过其他方式更改i来影响代码的其他潜在循环。我的代码可以简化为wr我猜,如果在新的setTimeout而不是整个函数中使用if,那么。
    (function() {
        // Define a variable
        var i = 0,
            action = function() {
                // Condition to run again
                if (i < 10) {
                    document.write(i + "<br>");
    
                    // Add one to i
                    i++;
                    setTimeout(action, 1000);
                }
            };
    
        setTimeout(action, 1000);
    })();
    
    var var2;
    var tmp;
    var evt;
    var i=0;
    var res = document.getElementsByClassName('mar-plp-filter-content nav nav--stacked')[0].children.length;
    tmp = document.getElementsByClassName('mar-plp-filter-content nav nav--stacked')[0].children;
    function myfunc()
    {
    if(i<res)
    {
    var2 = tmp[i].getElementsByTagName("span")[0].getElementsByClassName("inverted")[0];
    // alert(var2.innerHTML);
    var evObj = document.createEvent('MouseEvents');
    evObj.initEvent( 'mouseover', true, false );
    var2.dispatchEvent(evObj);
    var2.style.backgroundColor="GREEN";
    i++;
    setTimeout(myfunc,3000);
    }
    };
    setTimeout(myfunc,3000);