暂时性死区(TDZ)

274 阅读1分钟

在ES6之前,只有var来声明变量

var a = '1'
解释下上面变量的解析过程:var a(命名) | var a = undefined(初始化) | var = '1'(赋值
如果变量在未初始化前使用,由于变量提升的原因,将会返回undefined,如下

if(true){
   console.log(a)  //先使用
   var a = 'hello world'   //后赋值
}

由于变量提升的特点,上面函数等同于

if(true){
   var a;  //声明并初始化,此时为 undefined
   console.log(a)  //此时打印出来的值,undefined
   a = 'hello world'   //赋值
}

在ES6之后,增加了letconst来声明变量,声明块级作用域,而这样声明的变量必须先声明,后使用(其实,跟java这种强类型语言、先声明、后使用的原理是一样的)

let a = '1'
let、const声明的变量为块级作用域。如果在未初始化之前使用,就是抛出ReferenceError,因为let/const没有变量提升这么一说。

console.log(a)  //ReferenceError
let a = '1'

正确使用方法,如下

let a = '1' //先声明
console.log(a)  //后使用