了解回调以及解决这个问题的方法使我无法理解。 它应该每秒打印一个数字,直到零。目前,它记录的数字是10 - 0但是一次全部记录并继续无限循环。
请帮助我更好地了解这种情况。我已经阅读了回调并且有一个概念性的理解,但执行仍然有点棘手。
var seconds = 0;
var countDown = function(){
for(var cnt = 10; cnt > 0; cnt--){
setTimeout(function(x){
return function(){
seconds++
console.log(x);
};
}(cnt), seconds * 1000);
}
}
countDown()
答案 0 :(得分:2)
您的代码现在的工作方式,它执行for
循环,cnt
从10到1。这样可行。在每次迭代中,它会安排一个新函数在seconds * 1000
毫秒内运行,每次都仔细并正确地隔离cnt
中x
的值。问题是seconds
是0
,只有在回调执行后才会更改;但是当回调执行时,所有这些都已经被安排执行。如果您仍然需要seconds * 1000
进行调度,而for
循环仍在运行中,那么您需要在循环中更改seconds
,而不是在其中一个回调。
答案 1 :(得分:1)
阅读IIFEs,了解它们的工作原理。在这种情况下,您将创建要打印的值的闭包。你有正确的想法,但你的语法已经关闭。
var seconds = 0;
var countDown = function () {
var cnt = 10;
// simplify your loop
while (cnt--) {
// setTimeout expects a function
// use an IIFE to capture the current value to log
setTimeout((function (x) {
// return the function that setTimeout will execute
return function (){
console.log(x + 1);
};
}(cnt)), (++seconds) * 1000);
}
};
countDown();