我正在寻找一种方法来检查"全球" (超全局,类似"窗口")存在 - 如果不存在,则创建它。
几周前我在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 ;;但是,我确信有更好的方法可以做到这一点。
非常感谢任何输入,谢谢
答案 0 :(得分:0)
我从没想过这会有效吗?但确实如此!
在全球范围内,在window
之后,您可以简单地执行此操作:
global
现在,您可以像Object.freeze(this.Main); // makes it immutable
- 或 - Object.freeze(this.Main=this); // it actually works!
那样简单地在{{1}}上调用和定义内容。并且这些新属性将按预期存在于全局范围内。
在您对此对象进行更改之后;只需致电:
{{1}}
如果你想一次性完成(没有任何正当理由),你可以这样做:
{{1}}