Javascript命名空间

时间:2011-10-07 07:52:00

标签: javascript jquery inheritance module namespaces

我希望通过将其分成不同的文件并使每个文件成为“sub”命名空间来使我的javascript更加模块化。

subA.js

if(typeof ex == "undefined") {
    var ex = {};
}

ex.subA = function() {
//all functions of subA here
}

同样适用于subB等。

目前我有1个文件, ex.js

var ex = (function() {
    //private vars/funcs
    return {
        //public vars/funcs
    }
})();

看起来我应该将大部分函数移动到subA.js和subB.js,但在开始时仍然包含ex.js,然后使用subA.js和subB.js。

我有很多问题。

  1. 我很难记住我是如何创建初始命名空间文件ex.js.看起来匿名函数最初会将所有内容设为私有,但我不记得为什么需要将它括在括号中,然后在最后用();直接执行。

  2. 从q1开始,我的子文件是否应该与ex.js格式相同,即将anon函数包含在括号中并立即执行?

  3. 看起来子文件只能访问ex的公共函数,这是真的吗?如果是,我如何允许我的子文件访问私有函数?

  4. 在我的HTML文件中,在我的document.ready函数(jQuery)中,我应该将ex初始化为变量,还是可以通过继续单独调用每个函数

  5. $(document).ready(function() {
        ex.doSomething();
        ex.doSomethingElse();
    }

    这两者有区别吗?我认为当包含ex.js时,会立即创建一个全局变量ex(由于匿名函数被立即执行),所以我不需要在document.ready中重新定义它。

    1. subA.js中的第一个if语句与var ex = ex || {};有什么不同哪个更好?

    2. 您使用什么js代码样式标准?

    3. 如果你仔细阅读了所有这些,你就应该得到一个赞成,欢呼。

3 个答案:

答案 0 :(得分:5)

1。 function(){ return{}}是一个闭包,用于为您不希望在其他任何地方访问的变量和函数添加“隐私”,但在该函数的范围内。函数(function(){})周围的括号创建一个函数表达式。使用它们,因为当您尝试立即执行函数function(){}()而不将任何参数传递给()时,解析器会抱怨。

2。如果你希望subA或任何其他扩展对象拥有自己的子函数,那么是的,你必须像那样声明它,但不是必然是一个clousure。

你可以做到

ex.subA = function(x, y){
    return x+y;
}

可以称为var sum = ex.subA(2, 3);

或者你可以做到

ex.subA = (function(){

    return {
        add: function(x, y){
            return x+y;
        },
        multiply: function(x, y){
            return x*y;
        }
    }
})();

然后将其称为var sum = ex.subA.add(2, 3); var multiplication = ex.subA.multiply(2,3);

有很多方法可以做到这一点。

3。是的,它是真实的。您可以将私有函数公开。关闭将不允许任何其他方式。

4。如果您想要别名,是的,您可以将其分配给变量。但是,没有必要。它会像你描述的那样工作得很好。

阅读Essential JavaScript Namespacing Patterns以了解javascript命名空间中的一些基本原理和模式。


  

subA.js中的第一个if语句与var ex = ex ||有什么不同   {};哪个更好?

首先,if语句应为if(typeof ex == 'undefined')typeof返回一个字符串。无需检查ex是否为假。

是的,情况有所不同。如果已定义变量ex,则if语句不会执行任何变量赋值。因此,if语句更好。

  

你使用什么js代码风格标准?

取决于项目的范围,但主要是使用辅助函数扩展的深层对象。

答案 1 :(得分:2)

在您的设计中,您将无法访问该lambda函数中的私有变量/ funcs定义,因为它只返回一个对象,或者您想使用new

1.没有()ex是一个函数而不是函数返回的对象。

2.不需要,除了你想传递一些参数进行初始化。 e.g。

ex.my = (function(name) {var my_name = name;})('bar');

3.我认为你的意思是这种私人方法。

ex = (function() {
    var foo = 'bar';
    return {
        show: function() {alert(foo);}
    }
})();

在上面的案例中,只有ex可以访问foo。

4.不需要,当一切准备就绪时调用$(document).ready(),如果你已经加载了ex.js,则初始化完成。

  

加载DOM后和加载页面内容之前,其中的所有内容都会加载

答案 2 :(得分:0)

对于问题1和3:

ex.js中的闭包样式防御将允许那些公共函数和变量/暴露。

我的想法是,最好使用我们需要公开的函数和变量从anomyous函数返回“ex”。

第三季度

。在返回函数中定义和使用的那些(私有)变量仍然可用于函数,并且可以通过公开函数(闭包属性)使用。

如果外部脚本包含在文件的部分或顶部,那么ex应该在document.ready之前可用,并且应该可以立即使用。

你让我觉得:)当我进一步深入研究时,会更新帖子。很好的问题。 :)