3

我曾经喜欢使用 js。现在我只是沮丧。我正在尝试对我老板购买的大量代码进行 jsDoc 处理。作者没有提供 API,所以我将使用 jsDoc 创建一个。

不幸的是,代码并不清楚,它在一个 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...

所以我的问题是:

  1. 这是什么风格!?当我说风格时,我想我的意思是什么是 FooA 和 FooB?他们是对象吗?上课?

  2. 如果嵌套函数不是 X.FooA 或 X.FooB 的成员,我应该给它们什么标题。我被告知嵌套函数,包括 bar(),不是对象FooA 和 FooB 的方法。

  3. 如果嵌套在对象内部的函数实际上不是其周围对象的方法,是否可以从任何地方调用它?还是正常范围规则适用?

为了让生活变得更加可读和快乐,我一直将类似于 FooA 和 FooB 的对象分类为构造函数,并将构造函数内的任何方法(例如 bar())分类为 FooA 和 FooB 的方法。这可能不正确,但至少它是有组织的。有什么建议么?

谢谢你的帮助!

4

3 回答 3

3

FooA 和 FooB 是构造函数。

嵌套函数是“私有”函数。

FooA 内部的 bar 函数只能在 FooA 内部调用。

http://javascript.crockford.com/private.html

于 2012-12-28T03:11:22.280 回答
1

1)我认为你的命名空间预感是正确的。第一个自执行匿名函数获取全局命名空间。他们可能没有做一些简单的事情,比如:

window.X = {};

因为这在“窗口”不是全局对象的环境中不起作用。(就像服务器上的nodejs)

2)我不会调用这些方法。就个人而言,我认为这取决于这些功能的实际功能是什么。它们可以充当对象的更多名称空间或构造函数。如果它们是大写的,作者可能更多地将它们视为命名空间或类,而不是方法。

3) bar() 函数只能从 X.FooA 调用,但是要注意,它可以在 X.FooA实际声明之前调用

X.FooA = function() {
  bar(); // this will work
  function bar() {
    alert('this will work');
  }
}

这是因为在评估代码时,函数声明将被提升到周围函数的顶部。但是, bar 函数在 X.FooA 之外将不可用。

我不认为我会将 bar 归类为一种方法。也许作为“私人功能”或“私人方法”会更合适。

于 2012-12-28T03:11:21.640 回答
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}
}
于 2012-12-28T03:11:34.533 回答