JavaScript-如何识别或定义;“全球”;(超全局)用于严格模式下的跨平台使用 全球参考
我正在寻找一种方法来检查“全局”(超全局,类似于“窗口”)是否存在,如果不存在,就创建它 几周前,我在GitHub上的一些代码中看到了这一点,但是,现在我需要它,我在任何地方都找不到它。我可能看不到,但它非常短,非常智能,就像在1(短)行上一样-没有JavaScript-如何识别或定义;“全球”;(超全局)用于严格模式下的跨平台使用 全球参考,javascript,node.js,browser,cross-platform,Javascript,Node.js,Browser,Cross Platform,我正在寻找一种方法来检查“全局”(超全局,类似于“窗口”)是否存在,如果不存在,就创建它 几周前,我在GitHub上的一些代码中看到了这一点,但是,现在我需要它,我在任何地方都找不到它。我可能看不到,但它非常短,非常智能,就像在1(短)行上一样-没有if,也没有使用var(或let)-在全局范围内-->在严格模式下 我已经搜索了2个小时试图找到这个,我所能找到的是无数对“全局变量”的引用-在这种情况下,显然不是一个“变量”,因为超级全局“窗口”(或在NodeJS“全局”)是不可变的 我目前拥有的
if
,也没有使用var
(或let
)-在全局范围内-->在严格模式下
我已经搜索了2个小时试图找到这个,我所能找到的是无数对“全局变量”的引用-在这种情况下,显然不是一个“变量”,因为超级全局“窗口”(或在NodeJS“全局”)是不可变的
我目前拥有的解决方案不是很好,但它可以工作,有点:
"use strict";
if ('undefined' == typeof global)
{
Object.defineProperty
(
window,'global',
{
writable:false,
configurable:false,
enumerable:false,
value:window
}
);
}
因此,如果您尝试以下方法:
global = 'bite me!';
console.log(global);
然后,行为如预期的那样,抛出:
未捕获类型错误:无法分配给…的只读属性“全局”
这很好,-就像它应该表现的那样。
我不确定这是否是定义它的正确方法,因为如果我这样做:
global = 'bite me!';
console.log(global);
然后控制台显示如下内容:
窗口{顶部:窗口,…
这告诉我,它不是“全球”而是“窗口”——这是一个“循环”,是公平和幸福的。然而,我相信有更好的方法来做到这一点
任何意见都将不胜感激,谢谢我从未想过这会真正起作用;但它确实起作用了!
在全局范围内,在
使用strict;
之后,您只需执行以下操作:
this.Main = this;
现在,您可以像使用window
-或-global
一样,在Main
上简单地调用和定义事物;这些新属性将如预期的那样存在于全局范围中
对该对象进行更改后,只需调用:
Object.freeze(this.Main); // makes it immutable
如果您想一次完成所有工作(无任何正当理由),您可以这样做:
Object.freeze(this.Main=this); // it actually works!
我从来没有想过这会真正起作用;但它确实起作用了!
在全局范围内,在
使用strict;
之后,您只需执行以下操作:
this.Main = this;
现在,您可以像使用window
-或-global
一样,在Main
上简单地调用和定义事物;这些新属性将如预期的那样存在于全局范围中
对该对象进行更改后,只需调用:
Object.freeze(this.Main); // makes it immutable
如果您想一次完成所有工作(无任何正当理由),您可以这样做:
Object.freeze(this.Main=this); // it actually works!
window=window | | global |{some:new_object}
@adeneo::在浏览器中,“window”已经存在,因此,在这种情况下,它将保持“window”,而“global”将不会被定义;相反,它将抛出,因为“global”没有定义。此外,如果在“严格模式”下这样做,如果“window”出现错误,它将抛出一个错误没有定义,就像在NodeJS中使用一样;)好吧,你不能覆盖全局,如果它存在,它应该是它已经存在的样子,不是吗?把var放在第一位?var window=window | global | |{some:new_object}
这在技术上是重新定义的,但应该可以工作。另一种方法是只检查运行时var global=typeof module!='undefined'&&module.exports?global:typeof window!==undefined?window:{some:'other_object'};
window=window | global |{some:new| object}
@adeeo::在浏览器中,“窗口”已经存在,因此,在本例中,它将保持为“窗口”-“全局”将不被定义;但是,它将抛出,因为“全局”未定义。此外,如果在“严格模式”中以这种方式执行,则如果“窗口”将抛出错误“没有定义,就像在NodeJS中使用一样;)好吧,你不能覆盖全局,如果它存在,它应该是它已经存在的样子,不是吗?把var放在第一位?var window=window | global | |{some:new_object}
这在技术上需要重新定义,但应该可以工作。另一种方法是只检查运行时var global=typeof module!='undefined'&&module.exports?global:typeof window!==undefined?window:{some:'other_object'};