我喜欢使用js。现在我很沮丧。我正在尝试jsDoc我的老板购买的大量代码。作者没有提供API,因此我将使用jsDoc创建一个API。
不幸的是代码不清楚,它在一个js文件中包含大约10k行代码。我过去使用过对象文字,这不是对象文字。参数和函数不用逗号分隔。此外,从未使用原型,但新的运算符是。我看过几本书,命名空间似乎是最接近的'风格'。这是该程序的通用流程。我的问题遵循这个例子。
(function () {
var global = (function () {return this; } ).call();
global.X = {};
})();
X.init = function(){
X.MyObjectA = new X.FooA();
X.MyObjectB = new X.FooB();
}
X.FooA = function() {
var storeStuff;
do stuff
.
.
function bar(){
var storeSomething;
do something
do somthing else
.
.
moreFunctions(){}
var moreVars;
.
.
}
this.anOccasionalFunctionLiteral = function(){}
.
.
}
X.FooB = function(){
Similar contents of FooB()
}
.
.
.
Continues forever...
所以我的问题是:
这是什么风格!?当我说风格时我想我真的是指什么是FooA和FooB?他们是对象吗?类?
如果嵌套函数不是X.FooA或X.FooB 的成员,我应该给出什么标题。我被告知嵌套函数,包括bar(),不是对象的方法 FooA和FooB。
如果嵌套在对象内部的函数实际上不是其周围对象的方法,可以从任何地方调用吗?或者是否适用正常范围规则?
为了让生活更加可读和快乐,我一直在将类似于FooA和FooB的对象分类为构造函数和构造函数内部的任何方法,例如bar(),作为FooA和FooB的方法。这可能不正确,但至少它是有组织的。有什么建议吗?
感谢您的帮助!
答案 0 :(得分:3)
FooA和FooB是构造函数。
嵌套函数是“私有”函数。
FooA内部的bar函数只能在FooA中调用。
答案 1 :(得分:1)
1)我认为你的命名空间预感是正确的。第一个自执行匿名函数获取全局命名空间。他们可能没有做一些简单的事情:
window.X = {};
因为在'window'不是全局对象的环境中不起作用。 (如服务器上的nodejs)
2)我不会称这些方法。就个人而言,我认为这取决于这些功能的实际功能。它们可以像对象的其他命名空间或构造函数一样。如果它们大写,则作者可能更多地将它们视为名称空间或类,而不是方法。
3)bar()函数只能从X.FooA调用,但要注意,它可以在X.FooA 之前调用实际声明它
X.FooA = function() {
bar(); // this will work
function bar() {
alert('this will work');
}
}
这是因为在评估代码时,函数声明将被提升到周围函数的顶部。然而,在X.FooA之外,条形函数将不可用。
我认为我不会将bar归类为一种方法。也许作为一种“私人功能”或“私人方法”更为贴切。
答案 2 :(得分:1)
看起来FooA和FooB是'X'对象中包含的类。定义的类中的匿名函数本质上是私有方法,而命名的函数是包含类的公共方法。
var x = {
classA:function(){
do class constructor stuff...
function myPrivateMethod(){do stuff...}
this.myPublicMethod = function(){do stuff...}
},
classB:{another class contained in the object}
}