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

在一个未知的主机环境中,以ES5严格模式处理全局对象的build议方法是什么?

ECMAScript不提供一个内置的方式来引用我知道的全局对象。 如果是这样,这是我正在寻找的答案。

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

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

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

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

 var GLOBAL = (function(){return 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); }()); 

那么, 在任何环境下,无论严格模式如何处理全局对象,正确的方法是什么?

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

 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)); 

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

这就意味着在全球范围内的全局对象 ,所以解决办法很简单:

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

这意味着你必须通过引用自身来污染全局命名空间,但是就像你说的那样,它应该已经存在了。