likes
comments
collection
share

面试官想听到的满分回答—let、const解决了什么问题?

作者站长头像
站长
· 阅读数 33

问题

let、const解决了什么问题?

解答

分别从var let const区别语言特性知识点去进行回答:

  1. var具有声明提升,let、const没有;
  2. var、let声明的变量可以被重新赋值,const声明的变量必须进行初始化,并且不能再次被赋值;
  3. var声明的变量的作用域为window,let、const声明的变量的作用域为let、const与{}形成的块级作用域
  4. var是ES5引入的声明变量的关键字,let、const是ES6引入的声明变量的关键字。

这个时候我们要进一步深度的去讲述,从应用编译块级作用域闭包作用域链词法作用域用出来:

var会声明提升的原因,给出以下代码来分析

console.log(a);
console.log(b); 
var a = 1;
const b = 2;

面试官想听到的满分回答—let、const解决了什么问题? 面试官想听到的满分回答—let、const解决了什么问题?

分析

a的输出结果为undefined,b的输出结果会报错,不能在初始化变量b之前输出,原因是因为,在执行代码之前,V8引擎会先进行预编译全局预编译-->形成GO对象(Global Object 全局执行上下文对象)-->执行,碰见函数-->函数预编译-->形成AO对象(Activiation Object 函数执行上下文对象)-->执行函数,首先形成一个全局执行上下文,存放于栈结构内,此时变量a处于执行上下文的变量环境中,与 var不同,let声明的变量不会被提升到当前作用域的顶部,而是在执行到let语句时才会被添加到词法环境中。这也就意味着在let声明之前访问该变量会导致暂时性死区(Temporal Dead Zone, TDZ)的错误。

面试官想听到的满分回答—let、const解决了什么问题?

形成执行上下文的步骤:

  • 全局预编译:先是a进入变量环境,此时a为undefined,a变量被提升到当前作用域的顶部(window),因此上述代码相当于:
var a;
console.log(a);
console.log(b);
a = 1;
const b = 2;
  • 形成了全局执行上下文,此时的栈结构为: 面试官想听到的满分回答—let、const解决了什么问题?
  • 执行,输出a,会先去执行上下文的词法环境查找,然后再去变量环境中找,(如果执行函数时查找变量,会先去该函数执行上下文的词法环境中找,然后再去变量环境中找,再去outer指向的下一级的词法环境找,直到找到为止,outer的指向取决于词法作用域,词法作用域为该函数声明的位置,还要注意如果形成了闭包,也会去闭包内查找,当一个函数的内部函数被拿到外部去调用时,会形成一个闭包,该内部函数需要在外部函数引用的变量形成的一个集合叫做闭包) 此时找到了a,输出为undefined;再输出b,此时找不到,报错,因为let、const声明的变量只有在执行到let语句的时候才会被添加到词法环境中,所以在let、const声明之前访问变量会导致暂时性死区。执行完赋值语句后栈结构为

面试官想听到的满分回答—let、const解决了什么问题?

可能你会觉得上面的深度应该差不多了,wait wait wait!还可以更加深入:

es6的一大使命是让js成为像java一样的企业级大型语言

  • 变量提升这种不好理解的,影响代码可读性的特性通过暂时性死区规避掉;
  • for while......{} 内的变量最好使用let去声明变量,避免声明的变量污染了全局作用域;
  • var 没有常量功能,通过const 实现,代码中的配置等非常重要,在定义一个常量时,最好用const,常量的变量名最好用大写,来保持代码的优雅性。

结语

细节决定成败,在coding的途中一定要注意细节哦,好好coding,天天向上!

面试官想听到的满分回答—let、const解决了什么问题?

转载自:https://juejin.cn/post/7368662452529709083
评论
请登录