虽然用着ES6一些常用的简单语法,但是对于ES6一直没有一个完整的认识,不管是用得上还是用不上。于是决定重头好好学一遍ES6。
块级作用域:
Let和const声明的是块级作用域的变量,让变量的作用域更合理了,更是很简单的解决了for循环闭包的经典问题。
function f() { let n = 5; if (true) { let n = 10; console.log(n); //10 } console.log(n); //5}f()
外层代码块不受内层代码块的影响。
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。
不存在变量提升:
Let和const声明的变量不像var一样存在变量提升,声明的只能在let声明之后使用。
console.log(a); //ReferenceError: a is not definedlet a = 2;console.log(b);var b = 0;//undefined
暂时性死区:
区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。简单说就是let是优先级。
var a = 123;if (true) { a = 1; //ReferenceError: a is not defined let a;}
不允许重复声明:
const声明一个只读的常量。一旦声明,常量的值就不能改变。这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值,否则报错。
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。至于它指向的数据结构是不是可变的,就完全不能控制了。
const obj = {};obj.a = 0;
顶层对象:
顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。ES5 之中,顶层对象的属性与全局变量是等价的。
window.a = 1;a = 2;window.a // 2
上面代码中,顶层对象的属性赋值与全局变量的赋值,是同一件事。
顶层对象的属性与全局变量挂钩,被认为是 JavaScript 语言最大的设计败笔之一。
let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
let b = 1;
window.b // undefined
(完)