一、ES6声明变量的六种方法
ES5 只有两种声明变量的方法:var
命令和function
命令。ES6除了添加let
和const
命令,另外两种声明变量的方法:import
命令和class
命令。所以,ES6 一共有6种声明变量的方法。
1、let变量在代码块中有效。比如用for循环计数器,就很适合用let变量。
2、var
命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined
。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。为了纠正这种现象,let
命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
3、typeof将不再安全。在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。“暂时性死区”也意味着typeof
不再是一个百分之百安全的操作。变量x
使用let
命令声明,所以在声明之前,都属于x
的“死区”,只要用到该变量就会报错。因此,typeof
运行时就会抛出一个ReferenceError
。
二、块级作用域
1、es5和es6比较:es5 只有全局作用域和函数作用域,没有块级作用域。
2、let实际上为javascript新增了块级作用域
3、es6 允许块级作用域的任意嵌套。
4、es5规定函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明,严格模式下会报错。为ES5和es6环境避免报错,应不要在块级作用域里声明函数。
三、const命令
1、const
声明一个只读的常量。一旦声明,常量的值就不能改变。
2、const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。
3、const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用
4、对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const
命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only