Javascript命名空间
我希望通过将其分成不同的文件并使每个文件成为“子”命名空间来使我的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 || {};
什么不同var ex = ex || {};
哪个更好? -
你使用什么js代码风格标准?
如果你仔细阅读了所有这些,你就应该得到一个赞成,欢呼。
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);
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代码风格标准?
取决于项目的范围,但主要是使用辅助函数扩展的深层对象。
在您的设计中,您将无法访问lambda函数中的私有变量/ funcs定义,因为它只返回一个对象,或者您想使用new
?
1.没有()
, ex
是函数而不是函数返回的对象。
2.不需要,除了你想传递一些参数进行初始化。 例如
ex.my = (function(name) {var my_name = name;})('bar');
我认为你的意思是这种私人方法。
ex = (function() { var foo = 'bar'; return { show: function() {alert(foo);} } })();
在上面的例子中,只有ex可以访问foo。
4.no need, $(document).ready()
在一切准备就绪时被调用,如果你已经加载了ex.js,则初始化完成。
在加载DOM之后和加载页面内容之前,其中的所有内容都将加载
对于问题1和3:
ex.js中的闭包式定义将允许那些公共function和变量/暴露。
我的想法是,最好从具有我们需要暴露的函数和变量的anomyous函数返回“ex”。
第三季度。 在返回函数中定义和使用的那些(私有)变量仍然可用于函数,并且可以通过公开函数(闭包属性)使用。
如果外部脚本包含在文件的部分或顶部,那么ex应该在document.ready之前可用,并且应该可以立即使用。
你让我想到:)将更新post,因为我进一步挖掘这个。 很好的问题。 🙂