前言

关于ES6中的let存不存在变量提升的问题,我想大部分人都认为是不存在变量提升的,而官方文档关于这点也曾做过改动,最初是认为存在变量提升,后来又改成了不存在变量提升。而最近我在CSDN上看到一篇文章在探讨这个问题,于是自己就试验了一下。实践是检验真理的唯一标准,那么今天我们就来探讨一下到底let存不存在变量提升的问题。

变量提升

定义:函数声明和变量声明总是被JavaScript解释器隐式地提升(hoist)到包含他们的作用域的最顶端。

通过定义我们可以知道,只有变量的声明和函数的声明存在变量提升这一说,那么在ES6出现之前,JavaScript声明变量的方式是通过关键字var实现的,声明函数自然通过function啦,ES6中我们用let,const来声明变量和常量。

话不多说,直接上一段代码: { console.log(a) // 报错,a is not defined let a=2; }


这和官方文档所说的存在暂时性死区是一致的。
如果let存在变量提升,那么上述代码就相当于下面这样

1
2
3
{ let a; console.log(a) //undefined a=2; }```  
由此可见,let并不存在变量提升。此外,ES6新增了块级作用域的概念,块级作用域简单的来说就是用{}包裹起来的就是块级作用域。不妨再来看一个例子:

{ let a =11; console.log(a); //11 }```

console.log(a); //报错,a is not defined
因此,我们可以得出结论,let声明的变量不能跨块访问。