对于let是否存在变量提升的理解
变量的创建,初始化,赋值
// let 有暂时性死区,没有变量提升
// var 的「创建」和「初始化」都被提升了。
// function 的「创建」「初始化」和「赋值」都被提升了。
console.log(a); //undefined,说明var对变量的提升包括(创建和初始化)的提升,创建a并初始化为undefined
var a = 1
console.log(a); //1
console.log(typeof a2); //undefined,说明var对变量的提升包括(创建和初始化)的提升,创建a并初始化为undefined
var a2
b()
function b() {
console.log(2); //2
}
//说明function声明的变量的提升包括(创建和初始化和赋值)的提升,创建b并初始化并赋值为function(){ console.log(2) }
console.log(typeof d); //undfined
console.log(typeof c); //Cannot access 'c' before initialization
let c
//因为c是使用let声明的,那么在c未声明之前都属于暂时性死区,在使用typeof时就会报错。所以在使用let/const进行声明的变量在使用typeof时不一定安全
//如果我们只是用了typeof而没有去定义,也是不会报错的,从d可以看出只要没有明确规定使用const/let定义之前就是不会出错。
//let 声明变量 具有暂时性死区
let x = 'global'
{
console.log(x) //'global' 全局的x
}
let x = 'global'
{
console.log(x) // Cannot access 'x' before initialization 非全局的x
let x = 1
//console.log(x) 中的 x 指的是块级作用域内的 x,而不是全局的 x。ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。
//凡是在let声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
//暂时性死区:暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
}

浙公网安备 33010602011771号