2012-10-10 81 views
0

我以未確定的順序加載了我的JavaScript。我有一個名稱空間函數來註冊名稱空間。例如,它可以編寫這樣的事:以隨機順序加載的Javascript無法初始化

"com.stackoverflow.question".namespace(new function() { 
    this.sayHelloTo = function(text) { alert("Hello" + text); } 
}); 

不幸的是,namespace.js並不總是首先加載,如加載順序是隨機的,但其他腳本使用的命名空間功能。有沒有辦法實現這一點,而不會得到錯誤「.namespace」ist不是一個函數?

所以必須有一種方法來初始化後面的sayHelloTo定義,我有一切都是加載事件。所以即將發表的聲明有效,但我認爲這非常醜陋。

var postInit = postInit || []; 
postInit.push(function() { 
    "com.foo.bar".namespace(new function() { 
     this.sayHelloTo = function(text) { alert(text); } 
    }); 
}); 

而當事件發生時:

list.foreach(function(k, v) { v.call(); }); 

有沒有什麼更好的方法來實現這一目標?

回答

1

使用AMD:看看http://requirejs.org/。或者,common.js可能取決於使用情況。

+0

對不起,我忘了提及我不能在自己的JavaScript包括。我不在瀏覽器環境中,我在一個框架中,js文件以隨機順序編譯。所以我沒有訪問權限或可能性來加載/需要腳本。 – codevour

+0

什麼樣的框架包含隨機順序的js文件?你在用什麼? – manzoid

+0

它稍微複雜一些,但同樣的原則適用。您也可以將一個庫複製並粘貼到您堅持使用的代碼中(沒有任何關於需求的瀏覽器)。 將每個具有依賴項的函數都包裝在一個外部函數中,然後將該外部函數附加到加載依賴項時處理的隊列中(如果您對它們適用,則使用事件)。如果由於某種原因你甚至無法做到這一點,那麼輪詢命名空間定義可能是唯一的選擇,並在那個時候處理隊列。 –