let 和const 与var的区别

337 阅读2分钟

对于很多初学前端的小伙伴来说,var、let和const的区别大家都能说出个123来,都认为let和const 没有变量提升,只有var才有变量提升,网上很多帖子也认为let和const没有变量提升,其实,并非这样:

var、let和const的区别:

  1.var的变量提升,在【创建】之前就可以去调用,就是说在【创建】阶段就有变量提升,除此之外,var在【初始化】阶段也有变量提升;然而对于let来说,它在【创建】阶段被提升了,但是在【初始化】阶段的时候并没有被提升,对于const来说,const只有【创建】和【初始化】阶段,没有【赋值】阶段;let和const都存在一个暂时性死区(暂时性死区:创建了变量但是没有初始化,没法使用变量,‘Cannot access 'value' before initialization’),只在变量创建阶段有提升,在初始化阶段没有提升,形成的暂时性死区。

  要搞清楚提升的本质,需要理解 JS 变量的【创建create、初始化initialize 和赋值assign】。

    var的【创建、初始化、赋值】过程:

            

      在执行 fun时,会有以下过程(不完全):

1.  进入 fun,为 fun创建一个环境。
    1.  找到 fun中所有用 var 声明的变量,在这个环境中「创建」这些变量(即 x 和 y)。
    1.  将这些变量「初始化」为 undefined。
    1.  开始执行代码
    1.  x = 1 将 x 变量「赋值」为 1
    1.  y = 2 将 y 变量「赋值」为 2

      也就是说 var 声明会在代码执行之前就将「创建变量,并将其初始化为 undefined」。

      这就解释了为什么在 var x = 1 之前 console.log(x) 会得到 undefined。

    let的【创建、初始化、赋值】过程:

      

      在执行{}中的代码时,会有以下过程:

      1.为所有的let变量在环境中【创建】这些变量;

      2.开始执行代码;

      3.执行 x = 1,将 x 「初始化」为 1(这并不是一次赋值,如果代码是 let x,就将 x 初始化为 undefined)

      4.执行 x = 2,对 x 进行「赋值」

     为什么在声明x前调用会报错呢?

      其实在执行log时x还没有初始化,所以不能使用(也就是暂时性死区);

    const只有【创建、初始化】阶段,const和let都存在一个暂时性死区。

  2.var 没有块级作用域的概念,如果想搞出来一个保护内部变量的方法,可以使用闭包解决 ; let、const 有块级作用域的概念,局部作用域内部的大括号‘{}’,被称为块级作用域。

  3.var 可以重复声明同一个变量,let、const不能,const声明的变量不能直接修改值,但是const声明的对象和数组,是可以修改值,但不能修改引用地址。