无法在JavaScript中设置未定义的全局对象和命名空间的属性
我正在使用附加到窗口的变量:无法在JavaScript中设置未定义的全局对象和命名空间的属性,javascript,namespaces,window,global-variables,globalization,Javascript,Namespaces,Window,Global Variables,Globalization,我正在使用附加到窗口的变量: window.App 作为应用程序中其余变量的参考点。但是,当我尝试这样做时: window.App = {}; App.Views.User.Login = /* Login View Instance */; 它会抱怨视图未定义。这在很大程度上是好的,因为我可以预定义App.view、App.Models、App.Collections等 然而,当我们进入并不总是需要的子模块(App.Views.User)时,我更希望在需要时加载它 以下是唯一的选择吗 if
window.App
作为应用程序中其余变量的参考点。但是,当我尝试这样做时:
window.App = {};
App.Views.User.Login = /* Login View Instance */;
它会抱怨视图
未定义。这在很大程度上是好的,因为我可以预定义App.view、App.Models、App.Collections等
然而,当我们进入并不总是需要的子模块(App.Views.User
)时,我更希望在需要时加载它
以下是唯一的选择吗
if( ! App.Views.User ) { App.Views.User = {}; };
App.Views.User.Login = /* Login View Instance */;
我会像这样启动您的子模块:
App.Views.User = App.Views.User || {};
App.Views.User.Login = new Backbone.Marionette.ItemView.extend({});
只比你已经拥有的稍微干净一点,但这通常是你所做的。类似于:
namespace("myapp.mymodule.submodule.component",{});
其中:
function namespace (ns, module, optional_root) {
var root = optional_root || window,
array = ns.split("."),
name = "",
component_name = array.pop(),
i = 0, l = array.length;
for (; i < l; i += 1) {
name = array[i];
root[name] = root[name] || {};
root = root[name];
}
root[component_name] = module;
}
函数将在其中查找window.Appname
,或类似内容:
namespace("module.component", function(){}, Myapp);
如果模块不存在,您可以通过在Myapp
中定义module
来告诉它开始
唯一的缺点是,在加载模块之前,该函数必须存在
namespace("module.component", function(){}, Myapp);