Javascript模块使用情况

时间:2016-04-19 22:52:19

标签: javascript jquery

我刚刚开始使用javascript模块,我想确保我正确地完成它。

以下是我所遵循的方法示例,基于我读到的关于here的“松散增强模式”

    //myApp.js
    var myApp = {};


    //someModule1.js
    (function (ma) {
        ma.someModule1.DoStuff = function () {
            alert("hi");
        };
        return ma;
    }(myApp || {}));


    //someModule2.js
    (function (ma) {
        ma.someModule2.DoMoreStuff = function () {
            alert("ho");
        };
        return ma;
    }(myApp || {}));


    //someModule3.js
    myApp.someModule1.DoStuff();
    myApp.someModule2.DoMoreStuff();

myApp.js中的myApp变量将是唯一全局公开的变量,所有其他模块及其功能只能通过此变量访问。

someModule3.js不一定是模块,而是任何想要访问myApp对象属性的任意javascript(在定义了相应的模块之后)。

特别是我不是100%明确的部分是:( myApp || {},jQuery) 那部分叫做是什么以及它到底在做什么(我知道整个事情是一个闭包,但我只是不明白最后一部分是如何工作的)? 似乎“ma”最初没什么,我在封闭体中添加了一个函数,然后返回ma。此时myApp只有一个函数。

在最后一点(myApp || {})中,它实际上是在说“ma不是什么都没有,它实际上被称为myApp,如果它存在,我会将这些函数附加到该对象。”

这是对还是我离开了?

1 个答案:

答案 0 :(得分:1)

我看到四个问题:

  1. 您的代码不会按原样运行。您必须先定义static char buffer1[1024]; static char buffer2[2048]; static struct allocation allocations[] = { {1024, buffer1}, {2048, buffer2} }; ,然后才能分配给它。

  2. 由于您没有使用返回值,因此没有理由.someModule1

  3. 没有理由通过return ma,因为如果未定义myApp || {},那么您的代码将不执行任何操作,因为您创建的对象不会在任何变量中捕获将立即进行垃圾收集,无法访问。

  4. 当您展示了自己的代码时,除了添加代码行和复杂性之外,您附上代码的IIFE还没有完成。

  5. 以下是每个问题的详细信息。

    您的模块不会按原样运行。您需要通过更改此内容来定义myApp,并且代码中没有理由通过.someModule1

    myApp || {}

    到此:

    //someModule1.js
    (function (ma) {
        ma.someModule1.DoStuff = function () {
            alert("hi");
        };
        return ma;
    }(myApp || {}));
    

    由于您没有使用返回值,因此您也没有理由在代码中执行//someModule1.js (function (ma) { // you must define .someModule1 before you can assign properties to it ma.someModule1 = {}; ma.someModule1.DoStuff = function () { alert("hi"); }; return ma; }(myApp));

    这里return ma没有价值的原因是因为如果没有定义myApp || {},那么模块中没有任何代码可以做任何有用的事情,因为你要分配东西的底层对象不是在任何地方捕获变量。因此,如果未定义myApp,则您的代码不会完成任何操作。因此,有些定义为definitino,myApp必须已经定义为您的代码有用,因此,您可以将myApp传递给IIFE。

    当您展示代码时,将属性分配到IIFE中没有任何好处或理由。您没有任何关闭变量或IIFE中的任何私有内容。所以,你会得到完全相同的结果:

    myApp

    使用IIFE有一些原因,但您在此代码示例中没有显示任何内容。我个人喜欢使用最简单的代码来实现你的目标,而不是为了它而增加额外的复杂性。其他人喜欢将所有代码放在这些IIFE模块中。当我真的有理由让你的代码进入IIFE时,我只将我的代码放在IIFE中。