Javascript 命名空间与不同js文件中定义的多个模块混淆
我正在努力理解将所有模块添加到单个名称空间的简单方法 例如,我希望在全局级别上有一个名称空间,但我的模块是该名称空间的子级 这就是我到目前为止所做的 在我的第一个JS文件中,我已经完成了这项工作Javascript 命名空间与不同js文件中定义的多个模块混淆,javascript,namespaces,Javascript,Namespaces,我正在努力理解将所有模块添加到单个名称空间的简单方法 例如,我希望在全局级别上有一个名称空间,但我的模块是该名称空间的子级 这就是我到目前为止所做的 在我的第一个JS文件中,我已经完成了这项工作 var MyRootNamespace = window.MyRootNamespace || (window.MyRootNamespace = {}); (function() { MyRootNamespace.EventBus = (function () { ...
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;我也喜欢这种模式,所以你永远不会不定义——至少有一个空对象。