返回函数与返回对象

时间:2014-01-29 23:36:39

标签: javascript

在javascript中,有两种模式,我想强调使用一种与另一种的好处。返回对象与返回函数之间的区别是什么,例如:

var returnFunction = function(name,age){
  var n = name;
  var a = name;
  return function(){
    anotherFunc : function(){},
    oneMoreFunc : function(){}
  }
}

我返回了一个包含两个函数的函数,并访问私有变量name和age。我知道我可以调用return函数,我知道我可以像构造函数一样使用它。我想知道,这种风格有什么好处vs:

var returnObject = function(name,age){
  var n = name;
  var a = age;
  return {
    anotherFunc:function(){},
    oneMoreFunc:function(){},
  };
}
  • 是否存在性能损失?
  • 这只是风格问题吗?
  • 对于其中一方有什么好处,还是我只是想过这个?

修改

关于选项A,我在Javascript:The Good Parts

中引用了这个特定的语法
Function.prototype.method = function(name, func) {
    this.prototype[name] = func;
    return this;
};

String.method('deentityify', function() {

    // The entity table. It maps entity names to
    // characters.

    var entity = {
        quot: '"',
        lt: '<',
        gt: '>'
    };

    // Return the deentityify method.

    return function() {

        // This is the deentityify method. It calls the string
        // replace method, looking for substrings that start
        // with '&' and end with ';'. If the characters in
        // between are in the entity table, then replace the
        // entity with the character from the table. It uses
        // a regular expression (Chapter 7).

        return this.replace(/&([^&;]+);/g,
            function(a, b) {
                var r = entity[b];
                return typeof r === 'string' ? r : a;
            }
        );
    };
}());

选项A是一个旨在复制此语法的人为例子。

1 个答案:

答案 0 :(得分:1)

变体A不起作用。这是语法错误。

所以你真正在比较的是:

var returnFunction = function(name,age){
    var n = name;
    var a = name;

    // return a function that returns
    return function(){

        // logic to construct the object
        var obj = {
            anotherFunc : function(){},
            oneMoreFunc : function(){}
        }

        // return the object
        return obj;
    }
}

// vs.
var returnObject = function(name,age){
    var n = name;
    var a = age;

    // return the object directly
    return {
        anotherFunc:function(){},
        oneMoreFunc:function(){},
    };
}

这取决于对象的外观。

在大多数情况下,你会使用选项B.只需返回一个简单的对象。 除了V8,我什么都不知道,但在V8中看起来像这样:

- &GT;新范围 - &GT;分配一些变量 - &GT;创建一个功能 - &GT;编译该函数中的代码 - &GT;返回函数,关闭范围 - &GT;运行该功能 - &GT;新范围 - &GT;创建对象 - &GT;返回对象,关闭范围

VS

- &GT;新范围 - &GT;分配一些变量 - &GT;创建对象 - &GT;返回对象,关闭范围

显然第一步有更多步骤,但速度差异微不足道。

但是,在某些情况下,返回具有多个嵌套属性和必须初始化的本机函数的复杂对象是不切实际的。在生成对象并根据需要返回它时更有用的情况。哪个是选项A.

但是,比选项A更好,如果你打算对返回的对象进行干预,那么让它成为一个类更好:

var returnObjectClass = function(name,age){
    this.name = name;
    this.class = class;
    this.anotherFunc = function(){};
    this.oneMoreFunc = function(){};
    return this;
}

您可以在此处阅读更多内容:http://www.phpied.com/3-ways-to-define-a-javascript-class/