猛浪若奔 发表于 2022-3-26 09:28

JS for循环的问题

```
for (var i = 0; i < 3; i++) {
setTimeout(e => {
                console.log(i)
        }, 100)
}
```
哪位老哥能讲讲这个结果为什么是打印了三次3,要那种能折服面试官的那种

unmask 发表于 2022-3-26 09:41

这个是因为js的eventloop机制造成的,for循环只是制造了3个task放在宏任务队列等待执行,for循环完成后,i变量就变成了3,eventloop开始执行宏任务,因为有3个task,每个task打印i,所以会是3次3

flamestudio 发表于 2022-3-26 09:44

因为var声明的变量没有块级作用域,把var换成let,打印的就是0 1 2了。

ailuo9494 发表于 2022-3-26 09:44

在定时输出之前,值已经进行了改变

猛浪若奔 发表于 2022-3-26 09:54

unmask 发表于 2022-3-26 09:41
这个是因为js的eventloop机制造成的,for循环只是制造了3个task放在宏任务队列等待执行,for循环完成后,i ...

受教了,看来还得再查一下宏/微任务

nanke277 发表于 2022-3-26 09:55

就为了面试官

柒呀柒 发表于 2022-3-26 10:00

这个就要研究下eventloop了,就是代码的执行过程了。

涛之雨 发表于 2022-3-26 10:02

本帖最后由 涛之雨 于 2022-3-26 10:06 编辑

在楼上unmask的回复后面继续:

因此es6舍弃了var,引入了let和const,现在的eslint强规范会默认禁用var,如果上述相同的代码使用let作为声明,

(这里是代码块,上面代码复制过来,var改成let)

就会依次输出0,1,2,因为使用let声明后,i作为每次timeout函数中内部作用域(术语为scope)的局部参数,
而事实上,改成let后在eslint强规范中也还是会报错,因为赋值声明后不再修改的对象需要用const,
然后你看着编就行

这些考别人的人就吃这一套,
举一反三,他问你一个问题,
你啪啪啪回答三个问题,(1。他原来的问题2。let和var有什么区别3。那应该改成什么)
考官都懵了
(当然以上都是我的幻想=_=目前还没有求职经验。。。)

linguo2625469 发表于 2022-3-26 10:06

由于运行机制问题 以及变量提升那些

夜泉 发表于 2022-3-26 10:09

本帖最后由 夜泉 于 2022-3-26 10:10 编辑

面试官问这么简单的问题吗?

如果你学习es6,那么这个知识点肯定会被讲到的额、

https://es6.ruanyifeng.com/#docs/let
页: [1] 2
查看完整版本: JS for循环的问题