簡體   English   中英

JavaScript函數包含可以相互訪問的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM