Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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、for循环和回调函数_Javascript_For Loop_Callback_Settimeout - Fatal编程技术网

Javascript:setTimeout、for循环和回调函数

Javascript:setTimeout、for循环和回调函数,javascript,for-loop,callback,settimeout,Javascript,For Loop,Callback,Settimeout,我正在做这个密码拼图 以下是我目前掌握的情况: for (var i = 0; i < 1000; i += 100) { waitFor(i, function then() { console.log(i) }) } // this will run a callback function after waiting milliseconds function waitFor(milliseconds, callback) { setTimeout(c

我正在做这个密码拼图

以下是我目前掌握的情况:

for (var i = 0; i < 1000; i += 100) {
    waitFor(i, function then() {
    console.log(i)
    })
}

// this will run a callback function after waiting milliseconds
function waitFor(milliseconds, callback) {
    setTimeout(callback.apply(), milliseconds)
}
这会从0注销到900,但它会一次全部注销,然后在最后等待900毫秒,而不是在每个console.log之间等待1毫秒


有人能帮我理解吗?

您的代码中有两个不同的问题:

闭包导致总是打印值1000而不是100、200。。。等 您使用的超时时间太短,因此函数正在连续快速执行。 第一个问题很难用一个单一的答案来解释,但我将尝试给您一些见解,因为将变量值打印到控制台的函数是在for循环中定义的,该函数将始终保留循环结束时存在的I的值,在您的情况下,这是1000

要解决这个问题,您需要类似于@thg435在其评论中提到的内容,类似于:

// this will run a callback function after waiting milliseconds
function waitFor(milliseconds, callback) {
    setTimeout(callback, milliseconds);
}

function createFunction(i) {
    return function() { console.log(i); };
}

for (var i = 0; i < 1000; i += 100) {
    waitFor(i, createFunction(i));
}

循环结束时将发生第一次计时器调用。在此上下文中,由于JS使用的是引用而不是值,因此i=1000。要解决此问题,您必须使用闭包。

原始谜题的答案如下:谢谢thg435,我会看一看。我尝试了它,它立即注销了1000次。@Ber我已将我的答案完全修改为新答案,请检查编辑。当我第一次回答的时候我很忙,我把一切都搞砸了,很抱歉。谢谢Sniffer的解释,我按照这些行修改了代码,现在可以工作了@不客气,很高兴我能帮上忙。您需要深入阅读闭包,因为闭包是一个令人讨厌的主题,但一旦您很好地理解它们,就会发现它们非常有用。
waitFor(i*10, createFunction(i));
        ^^^^