为什么Javascript显示带有setTimeout函数同步和异步的输出

why Javascript showing output with setTimeout function sync and async?

本文关键字:同步 异步 输出 函数 setTimeout Javascript 显示 为什么      更新时间:2023-09-26

for(var i = 2;i >= 1;i--) {
  setTimeout(function (i) {
    console.log(i);
  },1000);
  console.log("hii");
}

这段代码给我的输出为

  • 定义

  • 定义

其中,在以下格式中使用 setTimeout 后给出不同的输出

for(var i = 2;i >= 1;i--) {
  setTimeout(print(i),5000);
  console.log("hii");
}
function print(i) {
  console.log(i);
}

这段代码给我的输出为

  • 阿拉伯数字

  • 1

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

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

在第一个示例中,您传递的函数采用单个参数,i setTimeout ,但 setTimeout 在调用该函数(或与此相关的任何函数(时不会将任何参数传递给该函数(或与此相关的任何函数(。因此,i在该函数中未定义,因此输出undefined

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

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

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