编写JavaScript函数的更好方法

时间:2011-10-30 11:14:59

标签: javascript

以下编写javascript函数的方法是等效的。

也许第一个更清楚。

然而,许多程序员更喜欢第二种方式。

优先选择第二种方式的两种方式之间存在显着差异吗?

第一种方式:

Class.prototype.fn = function () {
        var obj = { 
            … 
        };

        return obj;
};

第二种方式:

Class.prototype.fn = function () {

        return {
            .........
          };
};

1 个答案:

答案 0 :(得分:7)

除非您需要在通过文字创建后对obj执行操作,否则没有区别,这只是一种主观风格偏好。 (注意,所述使用可能在代码中,或在调试期间;更多在下面。)

例如,这里有一个真正的实际区别:

Class.prototype.fn = function () {
        var obj = { 
            subordinate: {
                foo: function() {
                    if (obj.flag) {
                        doOneThing();
                    }
                    else {
                        doSomethingElse();
                    }
                }
            }
        };

        return obj;
};

在那里,您需要名称,以便obj.subordinate.foo()有效。 (并不是说我主张这样做,但它是一个客观而非主观区别的例子。)但是,除非需要在初始化之后和返回之前使用它,否则这只是一个主观的事情。

当然,该用法不一定必须在代码中。如果需要,带有obj变量的表单在调试时会更有用在你归还之前检查你要归还的东西。


也许这里有点偏离滑雪道,但我认为它是相关的:与你问题中的例子相比,这之间有一个真实的,实际的,切实的区别:

Class.prototype.foo = function () {
        … 
};
Class.prototype.bar = function () {
        … 
};

和此:

(function() {
    function Class_foo() {
            … 
    }
    function Class_bar() {
            … 
    }

    Class.prototype.foo = Class_foo;
    Class.prototype.bar = Class_bar;
})();

......区别在于前者,函数没有名称(引用它们的属性,但不是函数本身)。在后一种情况下,functions have real names可以帮助您的工具通过显示调用堆栈中的名称,断点列表等来帮助您。