关于ES6中的let存不存在变量提升的问题,我想大部分人都认为是不存在变量提升的,而官方文档关于这点也曾做过改动,最初是认为存在变量提升,后来又改成了不存在变量提升。而最近我在CSDN上看到一篇文章在探讨这个问题,于是自己就试验了一下。实践是检验真理的唯一标准,那么今天我们就来探讨一下到底let存不存在变量提升的问题。
变量提升
定义:函数声明和变量声明总是被JavaScript解释器隐式地提升(hoist)到包含他们的作用域的最顶端。
通过定义我们可以知道,只有变量的声明和函数的声明存在变量提升这一说,那么在ES6出现之前,JavaScript声明变量的方式是通过关键字var实现的,声明函数自然通过function啦,ES6中我们用let,const来声明变量和常量。
话不多说,直接上一段代码:
{
console.log(a) // 报错,a is not defined
let a=2;
}
这和官方文档所说的存在暂时性死区是一致的。
如果let存在变量提升,那么上述代码就相当于下面这样
{
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声明的变量不能跨块访问。