为什么Javascript用setTimeout函数同步和异步显示输出?

时间:2016-11-17 09:20:59

标签: javascript node.js

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

我不明白为什么在第二种情况下代码是同步执行的。

3 个答案:

答案 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

在你的第二个片段中,回调被执行并返回打印在屏幕上的值