我可以在javascript中向'window'对象添加任何随机属性吗?有点像:
window.my_own_attr = "my_value"
对任何图书馆都有副作用吗?它是跨浏览器兼容的吗?
答案 0 :(得分:46)
我可以在javascript中为'window'对象添加任何随机属性吗?
是的,就像你已经表现出来一样。
对任何库都有副作用吗?
不,除非您使用设置属性的库然后覆盖。
它是跨浏览器兼容的吗?
是的,完全。
话虽如此,这种做法通常不受欢迎。你最终可能会覆盖你不想要的东西。
答案 1 :(得分:7)
在所有浏览器中,window
是javascript全局命名空间。每个属性或方法都“存在”该命名空间中。因此,如果您将属性分配给window
,则它实际上是全局变量。
示例:
window.myConstant = 5;
function multiply(val){
return myConstant * (val || 1);
}
multiply(10); //=> 50
multiply(); //=> 5
你必须对javascript框架保持谨慎。例如,如果您声明window.JQuery
并使用JQuery
框架,JQuery
命名空间将被您的任务替换,使其无效。
答案 2 :(得分:2)
是的,你可以,但一般来说你不应该。
window
对象也是JS默认的“全局”对象,因此所有全局变量都会被添加到那里。
除非你覆盖已经存在的属性,否则你不可能破坏任何东西,但是在window
上转储变量或者创建大量全局变量被认为是不好的做法。
答案 3 :(得分:1)
在IE中,如果元素具有id,则该节点可作为属性在窗口对象上访问:
<div id="num"></div>
alert(num); //Element
num = 3; //throws exception
var num = 3; //ok
答案 4 :(得分:1)
我不会重复别人所说的话:这种做法的愚蠢。但是当使用像Angular和vanilla HTML / JS(或jQuery)代码混合的僵硬框架时,它会非常有用。这也是hacky和不赞成的,但有时候有很好的理由,比如你有很多预先存在的JS代码,这些代码很难融入框架。
对我来说,更有趣的问题是如何利用向全局window
对象添加属性的能力。当我想将Angular提供程序(服务)的方法公开给代码时,我会使用一种模式,否则将无法注入服务,可能是因为它在Angular DI框架之外运行。我这样做的方式如下:
window['MyServiceName'] = this
假设您已设计提供程序以遵循Singleton模式,现在可以从任何地方安全地调用提供程序的方法。非Angular脚本只需调用window['MyServiceName'].methodName()
答案 5 :(得分:0)
在使用相同的变量名之前,它将正常工作,与任何库没有冲突,将在所有浏览器中工作,但不建议这样做,因为这将创建全局JS变量。
答案 6 :(得分:0)
正如其他人所指出的,可以,是的,这意味着添加“全局变量”。
拥有全局变量不是最佳实践,但有时这是最简单的事情。例如,如果您使用IFrames并希望子窗口访问父窗口的某些属性。这样的属性必须是“全局”的,孩子才能访问它。但这也表明它不是“真正的全局”,而只是特定窗口的属性。但这可能会与其他属性名(例如,您在使用的某些库中在同一窗口中定义的函数的名称)发生冲突。
因此,我们知道全局变量是错误的。如果我们决定仍然使用它们,那么我们有什么办法可以减少它们的弊端?
是的:用一个或多或少的唯一名称定义一个SINGLE全局变量,然后将一个对象存储到其中。将您需要的所有其他“变量”存储为该单个对象的字段。
这样,您无需添加多个全局变量(每个窗口)。还不错。
或多或少地对其进行唯一命名,因此它不太可能与其他人的单个全局名称冲突。例如,您可以使用名称+'s'作为变量名称:
window.Panus = {};
:-)