通常,ready
事件jQuery函數被調用這樣
$(function() { /* ... */ });
// or
jQuery(function() { /* ... */ });
// or
jQuery(document).ready(function() { /* ... */ });
底線,該函數沒有給出特定的上下文;無論參數如何(在最後一個示例中爲document
),jQuery給該函數提供的實際上下文都是HTMLDocument
元素。爲什麼這是另一個話題。
一般而言,每個函數都會在所有內容加載後調用,但並不是必需的。在你的情況下,ready
事件發生之前有MyNameSpace
的引用。即使Javascript是一個LALR類型的語言,它會找到稍後聲明的符號,但這不是一個好習慣。在jQuery觸發ready
回調函數之前,MyNameSpace
會在後面設置爲什麼?你的ready
回調不會獲得新的參考。除非有意爲之,否則參考應在之內ready
回撥,當一切都準備就緒時。
然後,在ready
回調中,還有其他技術爲函數分配上下文。 lonesomeday幾乎給了正確的方式來完成你正在嘗試做的事情。
(function() {
// this == MyNamespace
}).call(MyNamespace);
上面的代碼執行匿名函數向右走,在那裏this == MyNameSpace
注:之間的區別適用和呼叫被描述下here
現在,自帶底部您提供的代碼:
//load the additional files that are needed and fire onReadyCallback
MyNameSpace.Util.loadFiles(defaultJsFiles,function(){
MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
onReadyCallback.apply(window);
});
});
這是有問題的,也是不必要的。功能onReadyCallback
只在那裏需要,還是會被多次調用?如果只需要被調用一次,饒全局命名空間,並簡單地做:
//load the additional files that are needed and fire onReadyCallback
MyNameSpace.Util.loadFiles(defaultJsFiles,function(){
MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
// if everything is done loading, the function will be executed, otherwise
// it's execution will be postponed later
jQuery(function() {
// create our nicely wrapped anonymous function now
(function() {
if(!this.loggedIn()){
return;
}
// ...Lots of Code referring to MyNameSpace using "this"
})(MyNameSpace); // grab our most recent reference of `MyNameSpace`
});
});
});
如果你不喜歡的縮進(它只是一個開發者的口味),在ready
回調以取代一切(東西等):
initMyNameSpace.apply(MyNameSpace);
,外創建功能,在全局空間:
function initMyNameSpace() {
if(!this.loggedIn()){
return;
}
// ...Lots of Code referring to MyNameSpace using "this"
};
但我會推薦,至少,把它在require
回調函數,所以......
- ...不污染與運行一次函數
- ...是不是從任何地方訪問全局命名空間(保持私營)
- ..編輯源代碼
- 等
注時。可很快發現:通常情況下,適用和調用用於避免重複訪問諸如some.thing.pretty.deep = value;
之類的對象,或者需要將一個函數應用於許多但不是所有對象,從而擴展對象的原型不是一個好主意。
無論如何,這是我的看法,以及我將如何做事,而不需要更多關於代碼的知識或做什麼。
我希望你的其他代碼看起來不像這樣。沒有冒犯... – 2011-06-08 16:33:41
@ yanick-rochon :)爲什麼你覺得它太亂了?任何提示(博客文章,書籍或兩個)將不勝感激... – 2011-06-08 16:38:40
因爲這個評論的答案需要一些發展,我給你的問題添加一個答案 – 2011-06-08 16:57:09