无法在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);