参考文档
阮一峰大神:ECMAScript 6 入门
let和const
1.let
let声明的变量只在它所在的代码块有效
不存在变量提升
在声明签使用就会形成暂时性死区
不允许重复声明
2.块级作用域
ES5没有块级作用域带来了很多不合理的场景
1.内层变量会覆盖外层变量
var tmp = new Date(); function f() { console.log(tmp); if (false) { var tmp = 'hello world'; } } f(); // undefined
该处原因在于变量提升所致
2.用来计数的循环变量泄露为全局变量
var s = 'hello'; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
上面代码中,变量i
只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
let为js新增了块级作用域
es6明确允许在块级作用域中声明函数,但应该避免。如果确实需要就应该携程函数表达式而不是函数声明语句
3.const
const
声明一个只读的常量。一旦声明,常量的值就不能改变。(变量所指向的内存地址不变,对简单类型的数据就是值不变)
声明就要赋值,否则报错
const
的作用域与let
命令相同:只在声明所在的块级作用域内有效,存在暂时性死区,不可重复声明
ES6共有6中声明变量的方式:var,function,let,const,import,class
4.顶层对象的属性
在浏览器环境指向window对象,在Node指的是global对象。
ES5之中,顶层对象的属性和全局变量是等价的。
window.a = 1; a // 1
ES6中,var命令和function命令声明的全局变量依旧是顶层变量,而let、const、class命令声明的全局变量不属于顶层变量。
let b = 1; window.b // undefined
5.globalThis对象
引入globalThis
作为顶层对象