1、let 

① 使用let声明的变量,所声明的变量只能在命令所在的代码块内有效。

 

 同样在代码块内的a和c,c在代码块内就可以输出,a在代码块外就找不到了。

② 使用let命令声明的变量在域解析的时候不会被提升。

从结果可以看出,a是undefined,b报错。此时的console.log(a);var a=1;就相当于var a; console.log(a); a=1;解析时声明提前了,而let不会声明提前,因此直接报错。

再来两个例子看一下:

 

即使在全局声明了变量,如果在函数内又声明了一次的话,只会执行函数体内的,不受外部影响。

 

阮一峰老师的经典示例图---暂时性死区:

③ let 不允许在同一个作用域下声明已经存在的变量

  

声明完直接就报错了。

④ let 在for循环中的应用

三种方式都能实现,但是最方便的还是let了。

let在for循环中的,在循环语句(判断条件)之内是一个父作用域,在循环体(被执行的语句)之中是一个子作用域。

当循环体之内有声明的let时,循环语句之内的let不起作用:

 

循环体之内没有重新声明,则执行循环语句之内的let:

 2、 const

  const具备let的3条特点(1、所声明的常量只在代码块中有效;2、声明的常量不会被提升;3、不能声明已经被声明的常量或者变量),同时还具备以下两点:

  1、声明常量的时候必须赋值

    

    

  2、声明的常量存储简单的数据类型时候后不可改变其值,如果存储的是对象,那么引用不可以被改变,至于对象里面的数据如何变化,是没有关系的。