全局对象

JavaScript 能够运行在不同的环境中,比较常见的有浏览器环境和 nodejs 环境,这些环境都有自己的全局对象。当我们想要获取全局对象时,可以在 web 浏览器中通过 window, frames, self 等变量得到,在 web worker 环境中只能使用 self ,某些情况下 this 也指向全局对象,但是在严格模式下和 JS 模块中 this 指向 undefined 。如果是在 nodejs 环境中只能通过 global 来得到全局变量,它的 this 指向的是所在模块,等同于 module.exports

还有一种比较可靠的方法就是使用 Function('return this')() 来获取全局对象,然而因为内容安全策略(CSP) 的限制,在如 Chrome Apps 这样的环境中禁用了 eval ,无法使用 Function

es6-shim 是这样来获取跨环境的全局对象的:

var getGlobal = function () {
	// the only reliable means to get the global object is
	// `Function('return this')()`
	// However, this causes CSP violations in Chrome apps.
	if (typeof self !== 'undefined') { return self; }
	if (typeof window !== 'undefined') { return window; }
	if (typeof global !== 'undefined') { return global; }
	throw new Error('unable to locate global object');
};

统一的全局对象

新的 globalThis 变量可以让我们以一种标准的方式来获取全局的对象,而无需关心当前的运行环境。不同于 window, self 等变量,任何情况下,我们只要把 globalThis 看做是全局的 this 即可。

它的属性特性是:

特性
writable true
configurale true
enumarable false

现在有了 globalThis 之后,我们可以直接这样使用:


var a = 1;
var b = 2;
var c = 3;
let d = 4;
const total = globalThis.a + globalThis.b + globalThis.c;
console.log('total:', total); // total: 6

需要注意的是通过 letconst 声明的全局变量不属于 globalThis