Let
ES6 新增了 let 命令,用于声明变量。其用法类似于 var ,但是所声明的变量只在 let命令所在的代码块内有效。
- for 循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for (let i = O; i < 3; i++) {
let i=’ abc ’;
console .log(i);
}
abc
abc
abc
正确运行以上代码将输出 3 次 abc 。这表明函数内部的变量 i 与循环变量土不在同一个作用域,而是有各自单独的作用域。
-
不存在变量提升
var 命令会发生“变量提升”现象, 即变量可以在声明之前使用,值为 undefined。这种现象多少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。
为了纠正这种现象, let 命令改变了语法行为,它所声明的变量一定要在声明后使用,否则便会报错 。
var 的情况
console .log (foo );
var foo = 2 ;
let 的情况
console .log (foo );
let foo = 2 ;
在以上代码中,变量 foo 用 var 命令声明会发生变量提升,即脚本开始运行时,变量 foo便己经存在,但是没有值,所以会输出 undefined。变量 bar 用 let 命令声明则不会发生变量提升。这表示在声 明它之前,变量 bar 是不存在的,这时如果用到它,就会抛出一个错误 ReferenceError。
-
暂时性死区
暂时性死区的本质就是,只要进入当前作用域,所要使用的变量就己经存在,但是不可获取,只有等到声明变量的那一行代码出现 , 才可以获取和使用该变量。
-
不允许重复声明
let 不允许在相同作用域内重复声明同 一个变量。
Const
const 声明一个只读的常量。 一旦声明,常量的值就不能改变 。
const 实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
对于简单类型的数据(数值、字符串、布尔值〉而言,值就保存在变量指向的内存地址中,因此等同于常量。但对于复合类型的数据(主要是对象和数组)而言,变量指向的内存地址保存的只是一个指针, const 只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,
这完全不能控制 。 因此,将一个对象声明为常量时必须非常小心。