for(var i = 2;i >= 1;i--) {
setTimeout(function (i) {
console.log(i);
},1000);
console.log("hii");
}
此代码为我输出
HII
HII
未定义
未定义
使用以下格式的setTimeout后,给出不同的输出
for(var i = 2;i >= 1;i--) {
setTimeout(print(i),5000);
console.log("hii");
}
function print(i) {
console.log(i);
}
此代码为我输出
2
HII
1
HII
我不明白为什么在第二种情况下代码是同步执行的。
答案 0 :(得分:5)
因为您调用了print
函数,所以它不会作为回调传递。在这种情况下,它将完成print
函数的执行,然后将返回值作为第一个参数传递给setTimeout。
这是你正在尝试的: -
for(var i = 2;i >= 1;i--) {
setTimeout(print(i),5000);
console.log("hii");
}
function print(i) {
return function(){console.log(i)}
}
答案 1 :(得分:2)
在第一个示例中,您传递的函数将单个参数i
传递给setTimeout,但是setTimeout在调用它时不会将任何参数传递给该函数(或任何函数)。因此,i
在该函数中未定义,因此输出undefined
。
在第二个示例中,您正在调用print,并将结果传递给setTimeout。但打印正在立即执行,这就是为什么在" hii"之前输出数字的原因。每次迭代。
答案 2 :(得分:1)
for(var i = 2;i >= 1;i--) {
setTimeout(function (i) {
console.log(i);
},1000);
console.log("hii");
}

Javascript具有功能级范围,而不是块级范围。所以当你在for循环中调用setTimeout
时,如下所示:
setTimeout(function (i) {
console.log(i);
},1000);
所发生的是引入的局部变量i
,该变量尚未设置为任何值,因此它在JS中返回undefined
。
在你的第二个片段中,回调被执行并返回打印在屏幕上的值