我无法理解为什么#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
答案 0 :(得分:1)
在第二个示例中,您在for循环中调用wait函数,这导致JavaScript仅在console.log
的值完成递增后才执行排队的i
命令。
在第一个示例中,带有log语句的函数在外部调用,并且只有在打印输出后才返回到for循环。回调正确地阻止了循环的进一步执行,直到每次调用外部函数为止。
答案 1 :(得分:-1)
第一个函数打印i
var。
第二个增加i
,同时继续for
循环,当超时结束i=4
时,它会打印4次4。
这是因为它是一个异步函数。
执行您想要的操作的正确方法是第一个,调用另一个函数来强制console.log(i)
,而不是继续func2
结束。