在未知主机环境中以 ES5 严格模式获取全局对象句柄的推荐方法是什么?
ECMAScript 不提供引用我所知道的全局对象的内置方法。如果是这样,这就是我正在寻找的答案。
在已知环境中,全局对象通常具有自引用属性。由于全局对象是全局作用域的VO,全局对象的属性是全局变量,所以我们可以使用它们从任何地方获取全局对象的句柄:
在 Web 浏览器中,我们可以使用
window
或self
。在 node.js 中,我们可以使用
global
.
但是,并非所有主机环境都必须如此。据我所知,Windows Script Host 没有提供任何访问全局对象的方法。在 WSH 中获取全局对象的推荐方法似乎是this
在它不能解析为对象的上下文中使用关键字。例如:
var GLOBAL = (function(){return this}());
这种技术适用于任何宿主环境,但不适用于严格模式,因为 undefinedthis
不会在严格模式下引用全局对象:
如果在严格模式代码中计算 this,则 this 值不会被强制转换为对象。null 或 undefined 的 this 值不会转换为全局对象,并且原始值不会转换为包装器对象。通过函数调用(包括使用 Function.prototype.apply 和 Function.prototype.call 进行的调用)传递的 this 值不会强制将传递的 this 值传递给对象 (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4)。
正如预期的那样,以下代码导致undefined
:
(function(){
"use strict";
var GLOBAL = (function(){return this}());
console.log(GLOBAL);
}());
那么,无论严格模式如何,在任何环境中获取全局对象句柄的正确方法是什么?
顺便说一句,我目前的方法是嗅探引用全局对象的全局变量,如下所示:
var self, window, global = global || window || self;
...然后只需使用global
. 我认为这是一个糟糕的解决方案,原因有很多,其中大部分是相当明显的,而且它没有解决 WSH 问题。