const和let到底存不存在变量提升?

每天做个总结吧,坚持就是胜利!

    /**
        @date 2021-05-27
        @description const和let到底存不存在变量提升?
    */
复制代码

壹(序)

面试中很常见的一个问题就是var,cosnt,let三者之间的区别,大部分答案会提到一个区别是:var存在变量提升,而const和let不存在变量提升;但在我的认知中,cosnt和let也是存在变量提升的,只是和var的变量提升有所不同。

贰(解释)

什么是变量提升?
js代码在运行的时候,分为编译阶段和执行阶段,其中变量提升就是发生在编译阶段,指的是在编译过程中,会去把变量的声明部分提升到代码顶部,比如:

// 正常代码
.
.
.
var a = 1;
.
.

// 变量提升后
var a;
.
.
.
a = 1;
.
.
复制代码

所以在var a = 1;之前使用a,也是可以的,只是值为undefined

console.log(a); // undefined
var a = 1;
复制代码

很显然,以上过程,是一个让人难以理解的:为什么我能在变量声明之前使用该变量?所以ES6为了纠正这个不合逻辑的现象,增加了constlet变量声明方式,并且在这两种声明方式声明的变量之前使用变量,是会报错的:

console.log(a); // Uncaught ReferenceError: a is not defined
let a = 1;
复制代码

那么这是不是就说明const和let就不存在变量提升呢?其实不然。
constlet其实是会进行变量提升的,只是他们相对于var来说,只进行了创建的提升,而var进行了创建和初始化的提升,所以var声明的变量在之前调用是一个undefined

叁(不足)

整理很不到位,并不能从以上篇幅清楚的看出为什么letcosnt不存在变量提升,之后查阅资料后再重构一下文章。

肆(引申)

其他区别:

  1. var可以重复定义;
  2. var和let定义的变量可以重新赋值;
  3. const和let有块级作用域;
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享