我希望通过将其分成不同的文件并使每个文件成为“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。
我有很多问题。
我很难记住我是如何创建初始命名空间文件ex.js.看起来匿名函数最初会将所有内容设为私有,但我不记得为什么需要将它括在括号中,然后在最后用();
直接执行。
从q1开始,我的子文件是否应该与ex.js格式相同,即将anon函数包含在括号中并立即执行?
看起来子文件只能访问ex
的公共函数,这是真的吗?如果是,我如何允许我的子文件访问私有函数?
在我的HTML文件中,在我的document.ready函数(jQuery)中,我应该将ex初始化为变量,还是可以通过继续单独调用每个函数
$(document).ready(function() { ex.doSomething(); ex.doSomethingElse(); }
这两者有区别吗?我认为当包含ex.js时,会立即创建一个全局变量ex(由于匿名函数被立即执行),所以我不需要在document.ready中重新定义它。
subA.js中的第一个if语句与var ex = ex || {};
有什么不同哪个更好?
您使用什么js代码样式标准?
如果你仔细阅读了所有这些,你就应该得到一个赞成,欢呼。
答案 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之前可用,并且应该可以立即使用。
你让我觉得:)当我进一步深入研究时,会更新帖子。很好的问题。 :)