Javascript命名空间

Mic*_*ael 10 javascript jquery inheritance namespaces module

我希望通过将其分成不同的文件并为每个文件提供一个"sub"命名空间来使我的javascript更加模块化.

subA.js

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

ex.subA = function() {
//all functions of subA here
}
Run Code Online (Sandbox Code Playgroud)

对于subB等也一样

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

var ex = (function() {
    //private vars/funcs
    return {
        //public vars/funcs
    }
})();
Run Code Online (Sandbox Code Playgroud)

看起来我应该将大部分函数移动到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初始化为变量还是可以通过继续单独调用每个函数

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

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

  1. subA.js中的第一个if语句是否与var ex = ex || {};哪个更好?

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

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

She*_*hef 5

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

2.如果你想要subA或任何其他扩展对象拥有自己的子功能,那么是的,你必须这样声明它,但不是必然是一个clousure.

你可以做

ex.subA = function(x, y){
    return x+y;
}
Run Code Online (Sandbox Code Playgroud)

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

或者你可以做到

ex.subA = (function(){

    return {
        add: function(x, y){
            return x+y;
        },
        multiply: function(x, y){
            return x*y;
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

然后打电话给它 var sum = ex.subA.add(2, 3); var multiplication = ex.subA.multiply(2,3);

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

是的,这是真的.您可以将私有函数公开.关闭将不允许任何其他方式这样做.

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

阅读Essential JavaScript命名空间模式,了解javascript命名空间中的一些基本原理和模式.


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

首先,if语句应该是if(typeof ex == 'undefined'),typeof返回一个字符串.没有必要检查是否ex是假的.

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

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

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