前言

前几天看一些论坛的大佬在辩论变量提升的问题,个人觉得这是一个没有意义的争论,但是看了评论区的一些大佬们的解答觉得言简意赅,瞬间就道破了这个辩论。

我们都说var相比于let和const而言,var存在变量提升的问题。

比如:

function() {
  console.log(a);// undefined
  var a = 1;
}

此时执行这个函数时,js扫描执行上下文时,js会读取到所有的变量的声明和值,然后js从上往下执行,var对变量提升的处理是给变量初始化值(undefined),也就是未定义。而let在做这方面处理时,则会直接报错(Uncaught ReferenceError: a is not defined)。这里就是我们常说的暂时性死区。通常可以理解为“变量不能使用的一个阶段“。

function() {
  console.log(a);// Uncaught ReferenceError: a is not defined
  let a = 1;
}

其实这里的区别就是var会赋予其初始化的值,而let不会。

引用大佬的解答

另外复制一下掘金上的一位大佬的解答:个人觉得很有参考价值。

① let 有无变量提升取决于你如何定义变量提升。 ② 若「变量提升」是指变量可在声明语句之前被调用,则 let 没有变量提升;若「变量提升」是指变量在声明语句之前就被执行上下文记住,则 let 有变量提升。 ③ JS 代码是即时编译与执行的,一个函数作用域会拥有一个执行上下文,执行上下文是一块存储空间。执行上下文内又有一个名为「变量环境」和「词法环境」的东西。 ④ 由 var 和 function 声明的变量,在代码编译完成后,执行之前,其变量名和值就被存储在变量环境中了,所以在代码执行阶段的任何时刻,都可以调用它们,自然也能在声明语句之前调用了。 ⑤ 由 const 和 let 声明的变量,在代码编译完成后,执行之前,其变量名被存储在词法环境中,代码执行过程中会从依据「词法环境→变量环境→闭包/上一个作用域」的顺序来查找变量,而词法环境所存储的值被要求只有在声明语句之后才能调用。所以会存在暂时性死区,但变量又确确实实被执行上下文提前记住了,所以可以把暂时性死区理解为「变量暂时不能使用的阶段」。所以得出结论 ①

最后修改:2021 年 12 月 16 日
如果觉得我的文章对你有用,可以对我进行您主观即不限定金额大小的打赏。