【问题标题】:While loop, increasing a variable has no effect inside a setimeout functionWhile 循环,增加变量在 settimeout 函数内没有影响
【发布时间】:2014-10-23 16:10:13
【问题描述】:

我在这个问题上花了很多时间,最后我可以在 jsfiddle 中以易于阅读的代码展示它:http://jsfiddle.net/Lb0g25ae/

function test(i) {
    return function() {
        console.log(i);
        //I need to increase valid here because this is where the script will choose wheter to increase or not (continue looping) valid depending on some conditions
    }
}

var valid = 0;
while (valid < 5) {
    setTimeout(test(valid), 1000*valid);
    valid++;
}

我需要它

function test(i) {
    return function() {
        console.log(i);
        valid++;
    }
}

var valid = 0;
while (valid < 5) {
    setTimeout(test(valid), 1000*valid);
}

但是这样循环不会停止,因为 valid 没有增加,这将产生无限循环和崩溃。有人能指出我正确的方向吗?

【问题讨论】:

    标签: javascript function while-loop settimeout


    【解决方案1】:

    Valid 不会增加,因为 while 循环不停地运行并立即使 cpu 过载。

    您需要在超时后调用测试。检查:

    var valid = 0;
    function test() {
        console.log(valid);
        valid++;
        if(valid < 5){
            setTimeout(test, 1000*valid);
        }
    }
    test();
    

    【讨论】:

    • 另外,如果您需要返回一个值,看起来您可能正在尝试这样做,请尝试使用回调样式,因为这个 SO 答案解释了一点:stackoverflow.com/a/7142064/1981678
    • 你真的让我很开心!现在我想了解这段代码是如何工作的。这是递归函数吗?非常感谢您帮助您解决了一个非常大的问题:)
    • 是的,它自己执行,所以它是递归的。
    【解决方案2】:

    有效的变量必须是全局的,所以试试这个

    var valid = 0;
    function test(i) {
        return function() {
            console.log(i);
            window.valid++;
        }
    }
    
    
    while (valid < 5) {
        setTimeout(test(valid), 1000*valid);
    }
    

    【讨论】:

    • 谢谢,但它崩溃了
    • 您的说法在技术上是正确的,但变量已经是全局的。 test() 中对 valid 的引用已经在引用全局变量。
    【解决方案3】:

    这里的问题是,while 循环必须运行到完成,然后才能运行任何超时。也就是说,valid 直到一秒过去并且没有其他代码在运行时才会递增,但这永远不会发生,因为 while 循环仍将运行......

    您需要在测试函数中安排以下超时时间。

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多