JavaScript - 如何在严格模式下识别或定义跨平台使用的 "global"(超全局)

JavaScript - how to identify or define THE "global" (super-global) for cross-platform use in strict mode

全球参考

我正在寻找一种方法来检查 "global"(超全局,-类似于 "window")是否存在 - 如果不存在,则创建它。

几周前,我在 GitHub 的一些代码中看到过这样做,但是,现在我需要它,但我无法在任何地方找到它。我可能看错了,但它很短而且很智能,就像在 1(短)行上一样 - 没有 if,也没有使用 var(或 let) - 在全球范围内--> 在严格模式下。

我已经搜索了 2 个小时试图找到它,我所能找到的只是对 "global variables" 的无数引用——在这种情况下,显然不是 "variable" 作为超级全局"window"(或在 NodeJS 中 "global")不可变。

我目前的解决方案不是很好,但它可以工作,排序:

"use strict";

if ('undefined' == typeof global)
{
    Object.defineProperty
    (
        window,'global',
        {
            writable:false,
            configurable:false,
            enumerable:false,
            value:window
        }
    );
}

因此,如果您尝试以下操作:

global = 'bite me!';

然后行为符合预期,它抛出:

Uncaught TypeError: Cannot assign to read only property 'global' of...

这很好,-完全符合它应有的表现。

我不确定这是否是定义它的正确方法,因为如果我这样做:

console.log(global);

然后控制台显示如下:

Window {top: Window, ...

这告诉我它不是 "global" 而是 "window"; -这是公平和幸福的 "circular";但是,我确信有更好的方法来做到这一点。

任何输入将不胜感激,谢谢

我从没想过这真的有用;但确实如此!
在全局范围内,在 use strict; 之后你可以简单地这样做:

this.Main = this;

现在您可以像使用 window - 或 - global 一样简单地调用和定义 Main 上的内容;并且这些新属性将按预期存在于全局范围内。

在您对该对象进行了您想要的更改之后;只需致电:

Object.freeze(this.Main);  // makes it immutable


如果您想一次完成所有操作(没有任何正当理由),您可以这样做:

Object.freeze(this.Main=this);  // it actually works!