ES6新增了
let和const两个命令来声明变量,这两个新的命令和ES5中的var命令有很多不同之处,而且使用let和const会让代码看起来更严谨。
块级作用域
在ES5的时候,只有全局作用域和函数作用域,ES6新增了块级作用域的概念,看下面的代码
在上面的代码块之中,分别用var和let声明了变量a和b,然后我们在代码块之外访问变量a和b,结果用var声明的变量a能够访问到,而用let声明的变量b报错了。这表明,用let声明的变量只在它所在的代码块内有效。for循环中的计数器就非常适合用let来声明,用let声明的计数器i的作用域仅仅在循环体中,外部是没法访问到的,而用var声明的计数器j的作用域却是全局的,在任何地方都能访问,而这并不是我们想要的结果。
不存在变量提升(必须先声明后使用)
用let声明的变量不会像var那样发生变量提升的现象,如果使用之前没有声明,就会报错。
上面的代码中,a是用var命令声明的,会发生变量提升(相当于自动在代码的顶部添加了var a;这一句),即脚本运行的时候a其实就已经存在了,只不过没有赋值,所以输出undefined。而let声明的变量不会提升,所以在使用的时候如果发现还没有声明,就会报错。这样也能够让我们在写代码的时候更规范,变量必须先声明后使用。
暂时性死区
只要块级作用域中存在let命令,它所声明的变量就会绑定(binding)这一区域,不再受外部的影响。
上面代码中,存在全局变量tmp,但是在块级作用域内let又声明了一个局部变量tmp,导致后者绑定了这一区域,所以在let声明tmp之前,对tmp进行赋值会报错
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量从一开始就形成了一个封闭作用域,凡是在声明之前就使用这些变量,就会报错。总之,在代码块内使用let或const声明变量之前,这些变量都是不可用的。在语法上,这称为暂时性死区。
不允许重复声明同一变量(在同一个块级作用域内)
let和const不允许在同一个作用域内重复声明同一变量。
因此,不能在函数内部重新声明参数
const声明的常量不允许修改
ES6新增了const命令,用来声明一个常量,既然是常量,就意味着一旦声明之后,变量的值就不能修改
既然const声明的常量不允许修改值,那就意味着,一旦声明就必须立即初始化,不能留到后面再赋值