let 声明会提升(hoist)吗?

271 阅读1分钟

JS 变量:「创建create、初始化initialize 和赋值assign」

  1. let 的「创建」过程被提升了,但是初始化没有提升。
  2. var 的「创建」和「初始化」都被提升了。
  3. function 的「创建」「初始化」和「赋值」都被提升了。

image.png

JS这门语言所有的声明都存在提升(var, let, const, function, function*, class)

let使用块级作用域,会形成暂时性死区(变量在初始化前无法使用)

console.log(a) // undefined
var a = 1
console.log(a) // 1
// 首先是创建a这个变量,然后变量会初始化为undefined,然后代码执行到var a = 1,变量a会被赋值为1

代码证明:

let a = 1
{
  a = 2
  let a
}

如果 let 不会提升,那么 a = 2 就会将外面的 a 由 1 变成 2

运行发现 a = 2 报错:Uncaught ReferenceError: Cannot access 'a' before initialization

let x = x 报错之后,再次 let x 依然会报错

如果 let x 的初始化过程失败了,那么x 变量就将永远处于 created 状态。

无法再次对 x 进行初始化(初始化只有一次机会)。

由于 x 无法被初始化,所以 x 永远处在暂时死区!

其实问题不大,因为此时代码已经报错了,后面的代码想执行也没机会