本文记录一些与 ES5 不同的语法特性,因为只记录了我比较关心的内容,所以记录的可能不全面。

块级作用于

1
2
3
4
{{{{
{let insane = 'Hello World'}
console.log(insane); // 报错
}}}};

由于 let insane 的声明在一个大括号中,出了这个大括号,变量 insane 就无法访问了,所以下面的 console.log 打印 insane 报错了,而在 ES5 中是不成立的。再来一个案例:

1
2
3
4
5
6
7
8
9
function f() { console.log('I am outside!'); }
(function () {
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}

f();
}());

以上的代码在 ES5 环境中运行,由于函数 f 被重复声明,具有提升效果后,后面的 f 函数提升到了函数头部,所以调用时调用的是已经被提升到函数头部的 f 函数,那么 ES5 中会输出 I am inside,而 ES6 中,由于块级作用域的问题,则会输出 I am outside。但注意,我们现在是在 node 环境下,而如果在浏览器环境下“块级作用域内声明的函数,行为类似于 var 声明的变量。”,会有提升到函数作用域的头部,具体请看书中解释。

顶层对象的属性

1
2
3
4
5
6
7
var a = 1;
// 如果在Node的REPL环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1

let b = 1;
window.b // undefined

上面代码中描述了 var 和 let 与顶层对象之间的关系,ES6 中,let 和 const 等新增变量声明的关键字脱离了顶层对象的关系,不再互相干扰。