使用var和let声明变量有什么区别? 基本上是面试必问的题(级别很高的大佬除外),
很多人的回答里面肯定包含变量提升这一条,认为var有变量提升,而let没有,其实呢,let也是有声明提升的,
首先来看一段代码
let x = 'foo';
{
console.log(x);
let x = 'bar';
}
这段代码在浏览器的运行结果如下
报错信息大概意思是说:在x初始化之前不能使用x
其实大家都知道中括号内是一个块级作用域,在x声明之前无法访问是因为暂时性死区的问题。
算然有个暂时性死区的概念来解释这个问题,但是我一直在纠结一个问题,在执行console.log(x);的时候,js为什么不去找全局作用域的x呢,他是怎么知道作用域内已经声明了一个x呢,如果let x没有提升的话,js是肯定不知道的,所以我认为let也是存在变量提升的。事实也确实如此。
我找到一篇大佬的文章,里面有足够的证据来说明let是存在变量提升的,大家可以参考一下, 我用了两个月的时间才理解 let
这篇文章里面把变量的声明过程分为三个步骤,创建、初始化和赋值,认为var在提升的时候同时默认初始化为undefined,所以每次在var之前访问变量都是undefined而let只创建变量,并没有进行初始化。
参考文章: