首页 > 试题广场 >

给出以下代码,输出的结果是什么?原因? ...

[问答题]
给出以下代码,输出的结果是什么?原因?


for(var i=0;i<5;i++) {

setTimeout(function(){

console.log(i);

},1000);

}

console.log(i)

举一个更完善的例子:


console.log(i) // 打印顺序:① 打印值:undefined

for (var i = 0; i < 3; i++) {
  console.log(i); // ② 0,1,2
  setTimeout(() => console.log(i), 0); // ⑥ 3,3,3
}

console.log(i) // ③ 3

for (let i = 0; i < 3; i++) {
  console.log(i); // ④ 0,1,2
  setTimeout(() => console.log(i), 0); // ⑦ 0,1,2
}

console.log(i) // ⑤ 3


关于顺序的问题其实很好理解,1-5都是同步任务,顺序执行,6-7的定时器属于异步宏任务,要等到同步任务执行完毕后才能执行

①  此处很好理解,var声明的变量会进行变量提升,也就是此处已经进行了声明,只不过到了for循环才进行赋值,因此是undefined。

⑥  var定义的变量属于全局变量。每次for循环,只是将定时器的回调函数加入队列,但并没有执行,且通过var定义的全局变量i无法跟随每次循环产生的回调函数一起进入队列。因此,在1ms后,执行产生的三个回调,输出的i均是来自全局作用域中的i,1ms三次for循环完全可以执行完毕,此时全局变量i也就变成了3,自然就会输出3次3。

⑦  let定义的是块级作用域,每次循环,块级作用域的变量i可以跟随定时器的回调一起进入队列,既然自己带着i,那每次只要输出自己带的i对应的值即可。

编辑于 2021-10-08 20:57:23 回复(0)
<p>55555</p>
发表于 2020-06-19 16:22:12 回复(0)