包含可以相互访问的对象的JavaScript函数

包含可以相互访问的对象的JavaScript函数,javascript,Javascript,我最初有下面这样的代码,在全局名称空间中没有任何内容,我能够从obj1调用obj2中的函数,反之亦然。一切都很好 (function() { var obj1 = { obj1_f1 : function() { }, obj1_f2 : function() { obj2.obj2_f1(); } }; var obj2 = { obj2_f1 : function(

我最初有下面这样的代码,在全局名称空间中没有任何内容,我能够从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调用函数时,我必须用全局对象名预先结束所有函数调用。我想我错过了一个技巧

谢谢你的帮助

Paul

您可以这样做(请参见备注):

这有时被称为“显示模块模式”,因为外部匿名作用域函数中的所有内容都是私有的,然后通过将它们放在返回的对象上来“显示”想要显示的部分。例如,如果只需要公开
obj1
,而不需要公开
obj2
,则可以这样做:

return {
    obj1: obj1
};

但是,我的问题是,为什么需要从全局上下文调用函数?使用现代事件处理和异步模块定义加载程序(如RequireJS),您真正需要的唯一全局函数(ugh)是AMD函数


旁注:我替换了您的
var…=新函数(){…}带有
var…=函数(){…}()
这里不需要使用
new
,这样做可能会让人感到困惑(并为生成的对象提供一个它不需要的额外原型)。但是如果你愿意,你可以使用你原来的表格,只要把结尾改成

this.obj1 = obj1;
this.obj2 = obj2;

…而不是返回对象。

我可能错了,但如果我理解正确,这看起来像是循环引用,很可能是设计错误。第一个函数不起作用;“ready”处理程序可能应该调用
obj1.obj1\u f1()
,因为在该点上没有可见的符号,而只调用
obj1\u f1
@Pointy:嗯,符号是可见的,但其值是
未定义的
:-)
this.obj1 = obj1;
this.obj2 = obj2;