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
声明的常量不允许修改值,那就意味着,一旦声明就必须立即初始化,不能留到后面再赋值