回调很难

时间:2015-08-22 03:18:06

标签: javascript loops callback

了解回调以及解决这个问题的方法使我无法理解。 它应该每秒打印一个数字,直到零。目前,它记录的数字是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()

2 个答案:

答案 0 :(得分:2)

您的代码现在的工作方式,它执行for循环,cnt从10到1。这样可行。在每次迭代中,它会安排一个新函数在seconds * 1000毫秒内运行,每次都仔细并正确地隔离cntx的值。问题是seconds0,只有在回调执行后才会更改;但是当回调执行时,所有这些都已经被安排执行。如果您仍然需要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();