获得句柄的推荐方法是什么 全局对象 在 ES5 严格模式下 在未知的宿主环境中?

ECMAScript 没有提供引用我所知道的全局对象的内置方法。如果是的话,这就是我正在寻找的答案。

在一个 已知环境, ,全局对象通常具有自引用属性。由于全局对象是 视氧浓度 对于全局作用域,全局对象的属性是全局变量,因此我们可以使用它们从任何地方获取全局对象的句柄:

  • 在网络浏览器中,我们可以使用 window 或者 self.

  • 在node.js中,我们可以使用 global.

然而,并非所有主机环境都是如此。据我所知,Windows Script Host没有提供任何访问全局对象的方法。在 WSH 中获取全局对象的推荐方法似乎是使用 this 关键字在不解析为对象的上下文中。例如:

var GLOBAL = (function(){return this}());

该技术适用于任何主机环境,但不适用于严格模式,因为未定义 this 不引用全局对象 严格模式:

如果在严格模式代码内评估 this,则 this 值不会被强制为对象。 this 值为 null 或 undefined 不会转换为全局对象 并且原始值不会转换为包装对象。通过函数调用(包括使用 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 问题。

有帮助吗?

解决方案

在 ES5 中,您可以通过间接 eval 调用从严格模式中获取对全局对象的引用:

"use strict";
var global = (1,eval)('this');

看一眼 我的文章;尤其是在这个 关于严格模式的部分.

其他提示

全局代码, , 这 thisBinding 无论严格模式如何,都设置为全局对象。这意味着您可以将其从那里传递到您的模块 IEFE 中:

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));

在严格模式下,获取全局对象的引用的方法是在引用自身的全局对象中分配一个变量。

那是 this 表示在全局上下文中时的全局对象, ,所以解决方案很简单:

"use strict";
var global = global || this;
(function() { global.hello = "world"; })();
console.log(hello); // Outputs 'world' as expected

意味着您必须通过对其自身的引用来污染全局名称空间,但正如您所说,它应该已经存在了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top