let 和 const 命令笔记

17 阅读2分钟

1. let命令

1.1 基本用法

let声明的变量只在let命令所在的代码块内有效。
```{
    let a = 10;
    var b = 1;
    }
    
    a  // ReferenceError: a is not define.
    b  // 1
例题:以下代码如果for里面使用var i = 0,那么最后将输出 10 .
```var a = [];
   for (let i = 0; i < 10; i++){
     a[i] = function (){
         console.log(i);
     };
   }
   a[6]();  // 6

解析:console.log() 语句是异步的,要等同步的都进行完才会进行异步输出。当用 var 声明时,经过变量提升,全局只有一个变量 i ,每一次循环,i 的值都会发生改变,而循环内,被赋予数组 a 的函数内部的 console.log( i )中的 i 指向全局的 i 。也就是说,所有数组 a 的成员中的 i 的指向的都是同一个 i ,导致运行时输出额的是最后一轮的 i 值。 当用 let 声明时,当前的 i 只在本轮循环内有效,所以相当于是每一次循环都是一个新的变量,于是最后输出就是 6 。 如果每一轮循环的变量都是重新声明的,那它怎么知道上一轮循环的值从而计算出本轮循环的值呢? 这是因为JavaScript引擎内部会记住上一轮循环的值,初始化本轮的 i 时,就在上一轮循环的基础上进行计算。 另外,for循环还有个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。 具体例题如下:

```for ( let i = 0; i < 3; i++){
    let i = 'abc';
    console.log(i);
   }
   
   // abc

1.2 不存在变量提升

必须先声明,再使用,否则就会报错。

```// var 的情况
    console.log(foo);  // 输出undefined
    var foo = 2;
    
  // let 的情况
    console.log(bar);  // 报错ReferenceError
    let bar = 2;

1.3 暂时性死区

只要块级作用域内存在let命令,它所声明的变量就绑定这个区域,不再受外部的影响。