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

时间:2016-05-09 23:20:57

标签: javascript node.js browser cross-platform

全球参考

我正在寻找一种方法来检查"全球" (超全局,类似"窗口")存在 - 如果不存在,则创建它。

几周前我在GitHub上的一些代码中看到过这种情况,但是,现在我需要它,我无法在任何地方找到它。我可能看上去很简陋,但它非常简短且非常聪明,如1(短)行 - 没有if,而且没有使用var(或let) - 在全球范围内 - >严格模式。

我一直在寻找2个小时试图找到这个,而我所能找到的只是无数提及"全局变量" - 在这种情况下,显然不是"变量"作为超级全球化的窗口" (或在NodeJS" global")不可变。

我目前拥有的解决方案并不是那么好,但它的工作原理是:

"use strict";

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

所以,如果你尝试类似的东西:

global = 'bite me!';

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

  

未捕获的TypeError:无法分配给只读属性' global'的...

哪个好,就像它应该表现的那样。

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

console.log(global);

然后控制台显示如下内容:

  

窗口{顶部:窗口,......

这告诉我它没有被识别为" global"但作为" window&#34 ;; - 这是公平和良好的循环&#34 ;;但是,我确信有更好的方法可以做到这一点。

非常感谢任何输入,谢谢

1 个答案:

答案 0 :(得分:0)

我从没想过这会有效吗?但确实如此! 在全球范围内,在window之后,您可以简单地执行此操作:

global

现在,您可以像Object.freeze(this.Main); // makes it immutable - 或 - Object.freeze(this.Main=this); // it actually works! 那样简单地在{{1}}上调用和定义内容。并且这些新属性将按预期存在于全局范围内。

在您对此对象进行更改之后;只需致电:

{{1}}


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

{{1}}