为什么Javascript使用setTimeout函数sync和async显示输出?

为什么Javascript使用setTimeout函数sync和async显示输出?,javascript,node.js,Javascript,Node.js,(变量i=2;i>=1;i--)的{ 设置超时(功能(i){ 控制台日志(i); },1000); 控制台日志(“hii”); }因为您在那里调用了print函数,所以它没有作为回调传递。在这种情况下,它将完成print函数的执行,然后将返回值作为第一个参数传递给setTimeout 这就是您正在尝试的:- for(var i = 2;i >= 1;i--) { setTimeout(print(i),5000); console.log("hii"); } function pr

(变量i=2;i>=1;i--)的
{
设置超时(功能(i){
控制台日志(i);
},1000);
控制台日志(“hii”);

}
因为您在那里调用了
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)}
}

在第一个示例中,您正在将一个函数传递给setTimeout,该函数只接受一个参数,
i
,但setTimeout在调用该函数时不会向该函数(或就此而言的任何函数)传递任何参数。因此,
i
在该函数中未定义,因此,
undefined
被输出

在第二个示例中,调用print,并将结果传递给setTimeout。但是print会立即执行,所以这就是为什么每次迭代“hii”之前都会输出一个数字。

(变量i=2;i>=1;i--)的
{
设置超时(功能(i){
控制台日志(i);
},1000);
控制台日志(“hii”);

}
在循环时执行
打印(i)
。它不返回函数(回调)。您需要运行
setTimeout(functionname或匿名函数)
not
setTimeout(somefunction())