此分类为学习ECMAScript 6的笔记,主要参考《ECMAScript 6 入门》
let命令,用来声明变量,所声明的变量只在let所在的代码块内有效。就是我们常说的“块级作用域”。
不存在变量提升,所以一定要在声明之后才能使用。
1 console.log(foo); // 输出undefined 2 console.log(bar); // 输出ReferenceError 3 4 var foo = 'foo'; 5 var bar = 'bar';
暂时性死区。只要块级作用域内存在let声明的变量,该变量在该区块内就不会受到外部的影响。
1 var foo = 1; 2 3 { 4 console.log(foo); // 输出ReferenceError 5 let foo = 2; 6 } 7 console.log(foo); // 输出1
有些死区比较隐蔽,不太容易发现
1 function foo(x = y, y = 1) { 2 console.log(x + y); 3 } 4 5 foo(); // 输出ReferenceError
定义x时,y还没有被定义,所以会报错。如果参数是 (x = 1, y = x), 就没有问题。
不允许重复声明。重复声明会报错
1 // 报错 2 function foo() { 3 let a = 1; 4 var a = 2; 5 } 6 7 // 报错 8 function foo() { 9 let a = 1; 10 let a = 2; 11 } 12 13 // 报错 14 function foo() { 15 var a = 1; 16 let a = 2; 17 }
const命令声明一个只读常量,声明时必须赋值,之后不可再更改。
1 const bar; // Uncaught SyntaxError: Missing initializer in const declaration 2 3 const foo = 1; 4 5 foo = 2; // Uncaught TypeError: Assignment to constant variable.
const命令与let命令一样,只在声明所在的代码块内有效,不提升,存在暂时性死区,并且不可重复声明。
对于符合变量,const命令只能保证变量名指向的地址不变,不能保证该数据不变,所以声明一个对象常量时要十分小心。
1 const foo = {}; 2 foo.name = 123; 3 4 foo.name // 123 5 6 foo = {}; // Uncaught TypeError: Assignment to constant variable.
let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性,全局变量将逐步与顶层对象的属性脱钩。
1 var a = 1; 2 window.a // 1 3 4 let b = 1; 5 window.b // undefined
ES6中,var,let,const应该如何选择