2012-10-05 69 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()

相關問題