首页 > 试题广场 >

执行以下代码,5 秒后内输出的结果为()

[单选题]
执行以下代码,5 秒后内输出的结果为()
for(var i = 0; i < 5; i++){
    setTimeout(function(){
        console.log(i);
    }, 1000 * i);
}

  • 1 2 3 4 5
  • 0 1 2 3 4
  • 4 4 4 4 4
  • 5 5 5 5 5
主程序不会等异步setTimeout()函数,等执行异步setTimeout()函数时,i早就变为5了,所以答案输出5  5 5 5 5 ,
发表于 2020-11-21 20:44:22 回复(0)
可为啥,在浏览器我看它输出01234呢???
发表于 2020-04-01 17:46:03 回复(1)
https://blog.csdn.net/Febby_/article/details/94763441 这篇博客把原因讲的很详细,看了应该就懂了 在所有同步任务执行完之前,任何的异步任务是不会执行的。 而setTimeout就是一个异步任务,所以会先执行for循环这个同步任务,把setTimeout()放进任务队列中等待主线程的for循环执行完毕,一旦"执行栈"中的所有同步任务执行完毕(循环结束后此时i=5)就会从队列中取出setTimeout()
编辑于 2020-09-07 10:01:13 回复(0)
将for循环的var换成let后,输出就会变成0 1 2 3 4
发表于 2020-05-21 16:46:40 回复(2)
因为同步队列的for循环执行完成才轮到异步队列, 每一次for循环的时候,settimeout都执行一次,但是里面的function(闭包函数)没有被执行,而是被放到了任务队列里面,等待执行,当i累加到5的时候跳出循环。此时全局只有一个变量i=>5,所以打印出来都是5。
发表于 2019-10-03 15:10:31 回复(0)
在高程4中其实说的很明白了。
for (var i = 0; i < 5; ++i) {
    setTimeout(() => console.log(i), 0)
}
// 你可能以为会输出0、1、2、3、4
// 实际上会输出5、5、5、5、5
之所以会这样,是因为在退出循环时,迭代变量保存的是导致循环退出的值:5。在之后执行超时逻辑时,所有的i都是同一个变量,因而输出的都是同一个最终值。


而使用let声明迭代变量时,JavaScript引擎在后台会为每个迭代循环声明一个新的迭代变量。每个setTimeout引用的都是不同的变量实例,所以console.log输出的是我们期望的值,也就是循环执行过程中每个迭代变量的值。
for (let i = 0; i < 5; ++i) {
    setTimeout(() => console.log(i), 0)
}
// 会输出0、1、2、3、4


发表于 2020-12-17 10:42:15 回复(0)
结束完for循环后,i的值为5,不再进去循环体,开始执行队列中的settimeout 任务,所以就是 5 5 5 5 5
发表于 2019-11-24 01:44:54 回复(0)
  • var 声明的变量没有块级作用域,循环变量 i 泄露为全局变量,循环结束后 i 的值为 5
  • setTimeout() 执行时,会将回调函数添加到异步队列,待主线程中的同步代码执行完成后,才会执行异步队列中的异步任务,此时 for 循环已经结束,console.log() 输出的 i 的值为 5
发表于 2022-07-18 00:27:00 回复(0)
setTimeout属于异步执行代码,不直接执行,放入异步队列中等待,setTimeout时间单位为毫秒,5秒钟后,异步队列开始执行,而此时i值为5
发表于 2019-08-21 10:50:06 回复(4)
每次异步存入任务队列的是:
function(){
    console.log(i);
};
for 循环结束时,任务队列有5个 function,此时 i=5,所以是 D 
重点是搞清楚异步是存入到循环队列的是什么东西。
发表于 2021-07-30 21:24:55 回复(0)
题目也有问题,定时器的延时不能乘i,否则就不止5秒了
发表于 2023-03-01 16:32:50 回复(1)
宏任务到微任务
发表于 2022-02-11 14:51:27 回复(0)
i<5,for循环结束后为什么会等于5呢
发表于 2020-07-03 12:44:39 回复(2)