2014-03-13 49 views
2

如果嵌入在網頁中的兩個腳本需要通信,則需要某種全局狀態,通常是全局變量。因此儘管最大限度地減少全局狀態總是一個好主意,但很少會有全局變量相處。Javascript全局名稱空間中的保留標識符

很容易選擇一個與已經標準化不衝突的變量名稱,比如我選擇fooFoo。但未來的兼容性呢?如果新的Web API或新的Ecmascript版本引入了foo函數或Foo對象,會發生什麼情況?當第三個腳本位於需要新標準Foo對象的頁面上時,它會崩潰,因爲我的腳本用完全不同的東西覆蓋了它。

但即使頁面上沒有第三方腳本,我的腳本可能會遇到麻煩。假設我已命名全局變量onfoo,稍後瀏覽器環境在全局窗口對象上引入新事件foo。每當這個新的事件被觸發,我的全局對象onfoo將被稱爲...

因此,我的問題是瀏覽器環境中是否存在任何保留全局標識符的概念或某些名稱是否被認爲是安全的。那麼我應該如何命名我的全局模塊呢?其他名稱空間(如自定義事件名稱)也是如此。

+0

「保留字」的列表對於已發佈的標準已經確立,ECMAScript第6版的草案應包含任何其他保留字(如果有的話)。 (W3C不控制ECMAScript,但它確實控制* DOM * API;這些DOM全局​​屬性在技術上並不是「保留標識符」。) – user2864740

+0

相信我,沒有未來的JavaScript版本會有'foo'關鍵字。而且,任何未來的變化都可能向後兼容。 –

+0

您可以隨時檢查某個對象是否已經設置了某個屬性。我最喜歡的做法就像'(「窗口中的位置」),以檢查位置是否是窗口中的關鍵字。這樣你就可以檢查一個名字是否被採用,並給出一個備份+記錄到後端,你的變量被採用。 – gpgekko

回答

1

如果使用一個模塊管理庫是不是一種選擇,你必須之間進行選擇:

  • 有意義的名稱:易的眼睛,維護好,他們與碰撞的風險(其他腳本或新的關鍵字)

  • 特殊的名字:

    þf = þf || {}; þf.yÖ = þf.yÖ || {};

沒有人會爲þf.yÖ對象添加屬性,因此將全局數據存儲在其中是安全的。它看起來很可怕:)

最好的方法是毫無疑問地使用模塊管理系統! This just adds the 'define' global object IIRC

-1

如果您必須使用全局變量,它應該最好是唯一的和命名空間的東西。例如,MarcFoo。其他任何人都不可能取這個名字。

1

因此儘管最小化全局狀態量總是一個好主意,但很少有人會相處,沒有全局變量。

然而,這樣的全局變量的名字只出現在少數地方,如果它真的有必要,可以很容易地改變一個可以編寫代碼。 (揭示)模塊模式或甚至全面的依賴管理幫助。

但是未來兼容性呢?

未來的事情是你不知道它。然而,您可以在網上搜索即將出臺的標準草案,如EcmaScript 6或W3 HTML5提案。然而,減少衝突的可能性可能有一些最佳做法。正如你所檢測到的,用on啓動模塊名稱可能不是一個好主意。

在瀏覽器環境中是否有保留全局標識符的概念,或者某些名稱是否被認爲是安全的。

Unsafe names1)是一個相當不錯的開始。它可能有點過時並且沒有詳盡,但是對你需要注意的事項給予了很好的概述。

那麼我該如何命名我的全局模塊呢?其他名稱空間(如自定義事件名稱)也是如此。

始終爲您的全局名稱使用自定義且最好是唯一的前綴。這可以是您的項目或公司名稱。

0

您不必使用全局變量。您可以重寫您的腳本以接受與之通信的「全局」對象。這使您可以靈活地更改通信頻道。所以,當你的舊代碼可能是這樣的:

//script1 
(function(){ 
    foo.message = "bar"; 
    // ... 
})(); 

//script2 
(function(){ 
    alert(foo.message); 
    // ... 
})(); 

你的新代碼應該是這樣的:

var global={}; 
//script1 
(function(foo){ 
    foo.message = "bar"; 
    // ... 
})(global); 

//script2 
(function(foo){ 
    alert(foo.message); 
    // ... 
})(global); 

當你的溝通渠道global明確地傳遞,而不是依賴窗口對象。

+0

'global'是在窗口對象上創建的,所以你仍然有一個全局變量,不是嗎? – Marc

+0

您不必使用全局變量。如果你把上面的代碼包裝到一個函數中,那麼global就是函數範圍的。 –

+0

確實如此,但不能在一個函數中將兩個嵌入腳本包裝在一個頁面上(不合並腳本)。 – Marc

相關問題