JS for循环的问题
```for (var i = 0; i < 3; i++) {
setTimeout(e => {
console.log(i)
}, 100)
}
```
哪位老哥能讲讲这个结果为什么是打印了三次3,要那种能折服面试官的那种 这个是因为js的eventloop机制造成的,for循环只是制造了3个task放在宏任务队列等待执行,for循环完成后,i变量就变成了3,eventloop开始执行宏任务,因为有3个task,每个task打印i,所以会是3次3 因为var声明的变量没有块级作用域,把var换成let,打印的就是0 1 2了。 在定时输出之前,值已经进行了改变 unmask 发表于 2022-3-26 09:41
这个是因为js的eventloop机制造成的,for循环只是制造了3个task放在宏任务队列等待执行,for循环完成后,i ...
受教了,看来还得再查一下宏/微任务 就为了面试官 这个就要研究下eventloop了,就是代码的执行过程了。 本帖最后由 涛之雨 于 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。那应该改成什么)
考官都懵了
(当然以上都是我的幻想=_=目前还没有求职经验。。。)
由于运行机制问题 以及变量提升那些 本帖最后由 夜泉 于 2022-3-26 10:10 编辑
面试官问这么简单的问题吗?
如果你学习es6,那么这个知识点肯定会被讲到的额、
https://es6.ruanyifeng.com/#docs/let
页:
[1]
2