2016-02-20 123 views
2

我有多個.js文件下的一個命名空間,假設我的命名空間是foo,每個文件中我有一個像下面的代碼:需要JavaScript頭文件嗎?

在文件utils.js

(function() { 

    window.foo = window.foo || {}; 
    foo.utils = foo.utils || {}; 
    foo.bar = foo.bar || {}; 

    var utils = foo.utils; 
    var bar = foo.bar; 

    utils.helper1 = function(abc) { 

     var xyz = bar(abc); 
     ... 
    } 

})(); 

基本上在每個js文件,我想有像var utils = foo.utils這樣的代碼,所以我不必每次都寫foo.utils。但是,我必須在頂部寫foo.utils = foo.utils || {};,因爲utils.js可能尚未加載。

我認爲要解決這一方法是有一個頭文件,並確保它總是首先加載,就基本宣告我的命名空間下的所有公共職能象下面這樣:

window.foo = windown.foo || {}; 
foo.bar = {}; 
foo.baz = {}; 
foo.utils = {}; 

有沒有更好的辦法?我不想確保我的js文件的加載順序。

回答

4

這聽起來像你已經知道的選擇。

  1. 腳本加載順序不受控制。確保每個單獨的文件在使用之前初始化名稱空間中的每個對象(如您的示例所示)。

  2. 確保首先加載的一個文件將初始化名稱空間。您將名稱空間初始化代碼放入一個文件中,並確保首先加載該文件。其他文件則知道名稱空間已經被初始化,所以他們不必這樣做。

有沒有更好的辦法?

不,不是真的。除了這些選擇之外,沒有捷徑。如果您不想強制執行任何特定的加載順序,那麼在分配給它之前,您需要使用樣板初始化名稱空間。

還有其他一些混合選項,例如您定義了一個函數,讓您可以分配給一個名稱空間,並且該函數將爲您創建名稱空間(如果它尚不存在)。但是當然,你必須確保這個函數已經被首先加載了,所以它不能真正爲你節省很多。

+0

3.在JavaScript插入之前(可能位於頭文件中),您可以在HTML中嵌入變量。但這不是一個理想的解決方案,因爲每次加載頁面時都會傳輸它(無緩存),並將HTML與JavaScript混合在一起。 –

+0

@ ssc-hrep3 - 我想這在技術上是一個選項,但是您必須將該代碼複製到每個HTML文件中,並且它仍然是順序敏感的,因爲您必須在加載相關腳本之前將其複製。而且,如果您必須進行更改,則必須修改每個HTML文件。我想我看不出比我們已有的選項2更好。 – jfriend00

+0

有趣的是,我沒有JavaScript的行業經驗,所以我認爲可能會有一些共識解決方案,或者一些我不知道的JavaScript魔法。謝謝! – Arch1tect