[英]JavaScript function containing objects that can access each other
我最初有下面的代碼,在全局命名空間中沒有任何內容,並且能夠從obj1調用obj2中的函數,反之亦然。 一切都很好。
(function() {
var obj1 = {
obj1_f1 : function() {
},
obj1_f2 : function() {
obj2.obj2_f1();
}
};
var obj2 = {
obj2_f1 : function() {
obj1.obj1_f1();
},
obj2_f2 : function() {
}
};
$(document).ready(function () {
obj1_f1();
});
})();
但是現在我需要從全局上下文中調用obj1對象中的函數,因此我必須引入一個全局對象:
var com_mycompany_make_sure_unique = new function() {
// use 'this.' so that obj1 is not in the global namespace
this.obj1 = {
obj1_f1 : function() {
},
obj1_f2 : function() {
com_mycompany_make_sure_unique.obj2.obj2_f2();
}
};
this.obj2 = {
obj2_f1 : function() {
com_mycompany_make_sure_unique.obj1.obj1_f1();
},
obj2_f2 : function() {
}
};
$(document).ready(function () {
com_mycompany_make_sure_unique.obj1.obj1_f1();
});
};
但我對此不太滿意-在跨obj1和obj2調用函數時,必須在所有函數調用前添加全局對象名。 我想我錯過了一個把戲。
謝謝你的幫助,
保羅
您可以執行此操作(請參閱評論):
var com_mycompany_make_sure_unique = function() {
// Continue using variables as you were before
var obj1 = {
obj1_f1 : function() {
},
obj1_f2 : function() {
obj2.obj2_f2();
}
};
var obj2 = {
obj2_f1 : function() {
obj1.obj1_f1();
},
obj2_f2 : function() {
}
};
$(document).ready(function () {
obj1.obj1_f1();
});
// Return an object that can be used via the `com_mycompany_make_sure_unique` variable
return {
obj1: obj1,
obj2: obj2
};
}();
有時將其稱為“公開模塊模式”,因為外部匿名作用域定義函數內部的所有內容都是私有的,然后您可以通過將要顯示的部分放在返回的對象上來“公開”這些部分。 例如,如果僅需要公開obj1
而不是obj2
,則可以執行以下操作:
return {
obj1: obj1
};
不過,我的問題是, 為什么需要從全局上下文中調用函數? 使用現代事件處理和諸如RequireJS之類的異步模塊定義加載器,您真正需要(唯一)的全局變量是AMD函數。
旁注:我替換了您的var ... = new function() { ... };
與var ... = function() { ... }();
這里不需要使用new
,這樣做可能會使人們感到困惑(並為生成的對象提供不需要的額外原型)。 但是您可以根據需要使用原始表單,只需將結尾更改為
this.obj1 = obj1;
this.obj2 = obj2;
...而不是返回對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.