顶层对象

ES6 中,为了保持兼容性,var 和 function 声明的全局变量依旧是顶层对象的属性

1
2
3
4
var a = 1 //如果在 Node 的 REPL 环境,可以写成 global.a 或者 this.a
window.a //1
let b = 1
window.b //undefined

global 对象

  • 在浏览器对象中,顶层对象是 window,但 Node 和 Web Worker 没有 window。
  • 在浏览器和 Web Worker 中,self 也指向顶层对象,但 Node 没有 self。
  • 在 Node 中,顶层对象是 global,但其他环境都不支持。

以下为两种勉强可以取到顶层对象的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//方法一
typeof window !== "undefined"
? window
: typeof process === "object" &&
typeof require === "function" &&
typeof global === "object"
? global
: this
//方法二
var getGlobal = function () {
if (typeof self !== "undefined") {
return self
}
if (typeof window !== "undefined") {
return window
}
if (typeof global !== "undefined") {
return global
}
throw new Error("unalbe to locate global object")
}