面试被问到:let不能在相同作用域重复声明的底层原理是什么?

新手上路,请多包涵

面试的时候问到老生常谈的问题:var、let和const声明的区别

我回答:

① var声明的变量会绑定到window对象中,而let和const声明的变量不会
② var声明的变量只有全局和函数作用域,而let和const声明的变量具有块级作用域
③ var声明的变量可以提前访问,而let和const声明的变量不能提前访问(暂时性死区)
④ var声明的变量可以重复声明,而let和const声明的变量不能重复声明
⑤ const声明的基础类型不可修改,const声明的引用类型只能修改该引用类型的属性而不能给该变量重新赋值

面试官接着问我,let不能在相同作用域重复声明的底层原理是什么?谈谈编译过程中发生了?

我知道var声明只有全局作用域和函数作用域两种,在编译过程声明会被提升到当前作用域顶部,会忽略后面的重复声明,如果重复使用的一个声明有一个初始值,那么它担当的不过是一个赋值语句的角色,如果重复使用的一个声明没有一个初始值,那么它不会对原来存在的变量有任何的影响

但是对于let我真不知道为什么,跟执行上下文中let声明存储在词法环境组件中未初始化unitialized有关吗?但是我使用let重复声明两个相同的变量,没有访问也会报错啊,网上没有查到相关的资料,ECMA文档看不懂啊(谷歌翻译不能看)

面试官说做一个合格的javaScript开发者一定要掌握编程语言的基础原理。。。

求教大家了!

如果有相关的资料分享一下,顿首!!!

阅读 3.7k
1 个回答

这个问题不好。

letconst 不能在相同作用域重复声明变量是规定,规范就是这么制定的,开发 JS 引擎的程序员就这么执行了。就像公司规定 9 点上班,员工 9 点之前就要到办公室打卡一样。没什么底层原理,我想怎么实现就怎么实现,想坐公交就坐公交、想开车就开车、想走路就走路。

也许某个实现方案会好一些,有些会差一些,但对于 JS 程序员而言,都是毫不相关的领域。如果想问,可以先问一下,候选人答不出来,面试官就应该把实现原理说出来,请候选人分析其中的道理。

这个面试官多半就是偶然看到篇讲解这方面知识的文章,奉为瑰宝,到处拿来卡人,跟孔乙己一样的。所以,没过是好事。题主收拾心情,再去面别家就是。

推荐问题
宣传栏