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));
^^^^