顶层对象的属性
顶层对象 在浏览器环境中,指的是,window 对象, 在 node 环境中 指的是 global 对象。
es5 中,顶层对象 的 属性,与, 全局变量 是 等价的。
window.a = 1;
a // 1
a = 2;
window.a // 2
上面 代码中,顶层对象 的 属性 赋值,与,全局变量的赋值是 同一件事。
顶层对象的属性 与 全局变量 相关, 被认为是 JavaScript 语言中 最大的设计败笔之一。
这样 的 设计带来了几个很大的问题:
首先, 无法 在编译时,就 提示 该变量 未声明的错误,只有运行时才能知道(因为全部变量可能是 顶层对象的属性创造的,而属性的创造是动态的);
其次,程序员 很容易 不知不觉 的 就 创建 全局变量(比如 打字出错)。
最后,顶层对象的属性,到处都 可以 读写的,这 非常 不利于模块化 编程。
ES6 为了 改变这一点, 一方面 规定,为了保持 兼容性, var 命令 和 function 命令 声明的全局变量,
依旧 是 顶层对象的属性; 另一方面,规定,let 命令, const 命令 , class 命令 声明的 全局变量,
将 不属于 顶层对象的属性。 从 ES6 开始,全局变量,将逐步 与 顶层 对象的 属性,隔离。
var a = 1;
// 如果 在 Node 的 REPL 环境,可以写成 global.a;
// 或者 采用 通用的方法,写成 this.s
window.a // 1
let b = 1;
window.b // undefined
上面的代码中,全局变量 a 由 var 命令 声明,所以 它是 顶层 对象的 属性,全局变量 b 由 let 命令声明, 所以 它 不是 顶层对象 的 属性,返回 undefined。