在严格模式下获取未知环境中的全局对象的引用

Dag*_*bit 22 javascript global ecma262 ecmascript-5 strict-mode

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

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

已知环境中,全局对象通常具有自引用属性.由于全局对象是全局范围的VO,因此全局对象的属性是全局变量,因此我们可以使用它们从任何位置获取全局对象的句柄:

  • 在Web浏览器中,我们可以使用windowself.

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

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

var GLOBAL = (function(){return this}());
Run Code Online (Sandbox Code Playgroud)

此技术适用于任何主机环境,但不适用于严格模式,因为undefined this不会在严格模式下引用全局对象:

如果在严格模式代码中对此进行评估,则不会将此值强制转换为对象.此null或undefined值不会转换为全局对象,并且原始值不会转换为包装器对象.通过函数调用传递的此值(包括使用Function.prototype.apply和Function.prototype.call进行的调用)不会强制将此值传递给对象(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);
}());
Run Code Online (Sandbox Code Playgroud)

那么,无论严格模式如何,在任何环境中获取全局对象句柄的正确方法是什么?

顺便说一句,我目前的方法是嗅探引用全局对象的全局变量,如下所示:

var self, window, global = global || window || self;
Run Code Online (Sandbox Code Playgroud)

......然后才使用global.我认为这是一个糟糕的解决方案,原因有很多,其中大多数是相当明显的,并没有解决WSH问题.

kan*_*gax 30

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

"use strict";
var global = (1,eval)('this');
Run Code Online (Sandbox Code Playgroud)

看看我的文章 ; 特别是在严格模式的这一部分.

  • upvoted.次要注意CSP限制:https://developer.chrome.com/extensions/contentSecurityPolicy#JSEval (4认同)

Ber*_*rgi 7

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

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));
Run Code Online (Sandbox Code Playgroud)