两个有回调的来源'在for循环中创建不同的结果

时间:2017-10-25 07:13:57

标签: javascript

我无法理解为什么#1和#2产生不同的结果。 根据我的基本理解,4,4,4,4是正确的,因为回调队列中存在回调(您可以在http://latentflip.com/loupe/处查看)。

//#1
function func1(a,b,func){
    var k = a + b;
    for (var i =0;i<k;i++){
        func(i);
    }
}

function func2(param){
    setTimeout(function() {
        console.log(param);
    }, 10);
}

func1(1,3,function(result){
    func2(result);
});

上述#1&gt;&gt;&gt;的结果0,1,2,3

//#2
function func1(a,b){
    var k = a + b;
    for (var i =0;i<k;i++){
        setTimeout(function() {
        console.log(i);
    }, 10);
    }
}

func1(1,3);

以上结果#2&gt;&gt;&gt; 4,4,4,4

2 个答案:

答案 0 :(得分:1)

在第二个示例中,您在for循环中调用wait函数,这导致JavaScript仅在console.log的值完成递增后才执行排队的i命令。

在第一个示例中,带有log语句的函数在外部调用,并且只有在打印输出后才返回到for循环。回调正确地阻止了循环的进一步执行,直到每次调用外部函数为止。

答案 1 :(得分:-1)

第一个函数打印i var。

第二个增加i,同时继续for循环,当超时结束i=4时,它会打印4次4。

这是因为它是一个异步函数。

执行您想要的操作的正确方法是第一个,调用另一个函数来强制console.log(i),而不是继续func2结束。