2012-10-05 106 views

回答

39

我可以在javascript中为'window'对象添加任何随机属性吗?

是的,就像你所示。

它是否对任何库有任何副作用?

不,除非您使用设置属性的库然后覆盖。

它是跨浏览器兼容吗?

是的,完全。


说了这么一句,这种做法一般是不被接受的。你最终可能会覆盖你不想要的东西。

+1

请参考:http://stackoverflow.com/questions/864942/,我不想改变'window.name',所以会使用一些怪异的名字,单独为我的应用程序。 – akkishore

+1

好吧,似乎只有'window.name'保留在重新加载:( – akkishore

+7

+1为回答所有三个OP的问题提供了一个信息性的方式 – ddtpoison777

2

是的,你可以,但一般你不应该。

window对象也是JS默认的“全局”对象,因此所有全局变量都被添加到那里。

除非覆盖已经存在的属性,否则不可能破坏任何内容,但在window上转储变量或以其他方式创建大量全局变量被认为是不好的做法。

0

路途艰险,做工精细,用任何一间图书馆,直到使用相同的变量名没有冲突,将在所有的浏览器,但不推荐,因为这将创造全球JS变量。

+0

'窗口'是无论如何一个全球性的对象,所以我确定吗? – akkishore

+0

in你的情况下,你可以直接访问'my_own_attr'而不用'window.',这使得它成为全局的,并且可以与其他具有相同名称的变量冲突。 – Dev

7

所有浏览器, window是javascript全局命名空间。每个属性或方法都“活在”该命名空间中。所以,如果你指定一个属性window,它是一个有效一个全局变量

例如:

window.myConstant = 5; 

function multiply(val){ 
    return myConstant * (val || 1); 
} 
multiply(10); //=> 50 
multiply(); //=> 5 

你必须用JavaScript框架持谨慎态度。举例来说,如果你声明window.JQuery,并使用JQuery框架下,JQuery命名空间将被你的任务所取代,使之无用。

0

在IE中,如果一个元素有一个id,则该节点是窗口对象作为属性上访问:

<div id="num"></div>

alert(num); //Element

num = 3; //throws exception

var num = 3; //ok

1

我不会重复别人所说的话:t的黑客行为他的做法。但是,当使用像Angular和vanilla HTML/JS(或jQuery)代码这样的僵化框架时,它会非常有用。这也是耻辱和皱眉,但有时也有很好的理由,如果你有很多预先存在的JS代码,将很难融入框架。

对我而言,更有趣的问题是如何利用向全局window对象添加属性的功能。当我想要公开Angular提供者(服务)的方法来编写代码时使用的模式,否则将无法注入服务,可能是因为它运行在Angular DI框架之外。我这样做的方式如下:

  1. 定义您的服务作为您的顶级模块中的提供者。
  2. 在构造函数或app.component.js的OnInit的(或任何你的顶级部件是进口供应商),注入提供商通常,执行任何需要的一次初始化,然后调用window['MyServiceName'] = this

假设您设计了提供者以遵循单例模式,现在可以从任何地方安全地调用您的提供者的方法。一个非角度脚本需要简单地调用window['MyServiceName'].methodName()

相关问题