我刚刚开始使用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,如果它存在,我会将这些函数附加到该对象。”
这是对还是我离开了?
答案 0 :(得分:1)
我看到四个问题:
您的代码不会按原样运行。您必须先定义static char buffer1[1024];
static char buffer2[2048];
static struct allocation allocations[] =
{ {1024, buffer1}, {2048, buffer2} };
,然后才能分配给它。
由于您没有使用返回值,因此没有理由.someModule1
。
没有理由通过return ma
,因为如果未定义myApp || {}
,那么您的代码将不执行任何操作,因为您创建的对象不会在任何变量中捕获将立即进行垃圾收集,无法访问。
当您展示了自己的代码时,除了添加代码行和复杂性之外,您附上代码的IIFE还没有完成。
以下是每个问题的详细信息。
您的模块不会按原样运行。您需要通过更改此内容来定义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中。