内容转载自阮一峰老师的ES6入门
ES6新增let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.
const声明的变量和let一样,只在声明的块级作用域有效,不同的是:let声明的变量可以改变,值和类型都可以改变,没有限制.
而const声明的变量不得改变值,这意味着,const一旦声明变量,就必须要立即初始化,不能留到以后再去赋值.
for循环的计数器,就很合适使用let命令:
上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是 10。
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。
let不存在变量提升
var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。
为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
上面代码中,变量foo用var命令声明,会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。变量bar用let命令声明,不会发生变量提升。这表示在声明它之前,变量bar是不存在的,这时如果用到它,就会抛出一个错误。
let不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。