如何避免在JavaScript中重复使用命名空间

4
我正在开发一个backbone应用程序。
我将我的models+集合+collections +视图结构化到不同的文件中。
这意味着像 function() { // all my code }() 这样的解决方案在这里不适用。
我添加了一个命名空间,比如 App.ModelName App.Views.ViewName 当我在相同的命名空间内时。如何避免重复输入它。 即,在定义在App.Views.ViewName中的函数中如何调用ModelName。
目前,我一直重复输入完整的字符串,即App.XXXX。
谢谢
3个回答

6
您有几个选择:

1)在每个函数中创建一个局部变量:

App.ModelName.myFunction = function() {
    var model = App.ModelName;
    // then you can reference just model
    model.myFunction2();
}

2) 在每个文件范围内创建一个局部变量:

(function() {
    var model = App.ModelName;

    model.myFunction = function() {
        // then you can reference just model
        model.myFunction2();
    }


    // other functions here

})();

3) 使用this的值:

App.ModelName.myFunction = function() {
    // call App.ModelName.myFunction2() if myFunction() was called normally
    this.myFunction2();   
}

2

命名空间就是全局作用域内的一个对象。

因此,一种替代方案是使用with,尽管它有一些缺点。

但无论如何,请查看以下示例:

window.test = {
    a: function(){ console.log(this); return 'x'; },
    b: function(){ with (this){ alert(a()); }}        // <- specifying (this)
};

window.test.b();

2
不建议使用 with,在 ECMAScript 5 严格模式下是被禁止的。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/with - Andrew D.
@AndrewD。嗯,我确实警告过一些缺点... :P - Silviu-Marian

1

把它们作为参数传递怎么样?就像这样:

(function(aM,aV) {
    // use aM and aV internally
})(App.Models,App.Views);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接