吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1148|回复: 13
收起左侧

[讨论] JS for循环的问题

  [复制链接]
猛浪若奔 发表于 2022-3-26 09:28
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
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表