Javascript 命名空间与不同js文件中定义的多个模块混淆

Javascript 命名空间与不同js文件中定义的多个模块混淆,javascript,namespaces,Javascript,Namespaces,我正在努力理解将所有模块添加到单个名称空间的简单方法 例如,我希望在全局级别上有一个名称空间,但我的模块是该名称空间的子级 这就是我到目前为止所做的 在我的第一个JS文件中,我已经完成了这项工作 var MyRootNamespace = window.MyRootNamespace || (window.MyRootNamespace = {}); (function() { MyRootNamespace.EventBus = (function () { ...

我正在努力理解将所有模块添加到单个名称空间的简单方法

例如,我希望在全局级别上有一个名称空间,但我的模块是该名称空间的子级

这就是我到目前为止所做的

在我的第一个JS文件中,我已经完成了这项工作

var MyRootNamespace = window.MyRootNamespace  || (window.MyRootNamespace = {});

(function() {
    MyRootNamespace.EventBus = (function () {

    ...

    })();
})();
在另一个模块中定义了一个不同的JS文件

(function() {

    jQuery(document).ready(function() {
        MyRootNamespace.EventBus.publish(...);
    });

})();
问题是,EventBus正在解析为未定义。MyRootNamespace存在于全局命名空间中,但经过检查,MyRootNamespace命名空间中不存在EventBus

虽然我理解名称空间的概念,但我很难理解如何为应用程序创建干净的名称空间

谢谢

不过我刚刚发现,如果在模块中使用传入的引用执行以下操作,那么所有操作都可以正常工作

(function(BUS) {

    jQuery(document).ready(function() {
        BUS.EventBus.publish(...);
    });

})(MyRootNamespace.EventBus);

有人能解释为什么吗?

尝试使用原型方法,而不是声明式方法。也就是说,MyRootNamespace.prototype.EventBus=…在发布这篇文章之后,我有了一个难得的机会,我希望这一分钱能掉下来。我将MyRootNamespace.EventBus作为参数传递给需要使用它的模块。我现在不再得到一个未定义的错误,它可以工作了。我仍然想知道为什么。我将编辑帖子以显示此函数$alias{$alias.foo=函数{console.log'bar'}}this.MyRootNamespace=this.MyRootNamespace | |{};MyRootNamespace.foo;我也喜欢这种模式,所以你永远不会不定义——至少有一个空对象。