2014-01-29 223 views
-2

在JavaScript中,有两种模式,我想衡量使用一个和另一个的好处。是什么和回访功能,例如返回一个对象之间的区别:返回函数与返回对象

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

我返回一个包含两个函数的函数,并获得私有变量的名字和年龄。我明白我可以调用returnfunction,并且我知道我可以像构造函数一样使用它。我想知道,什么是这种风格的VS好处:

var returnObject = function(name,age){ 
    var n = name; 
    var a = age; 
    return { 
    anotherFunc:function(){}, 
    oneMoreFunc:function(){}, 
    }; 
} 
  • 是否有性能损失?
  • 这只是一个风格问题吗?
  • 对这个或那个有任何好处,还是我只是在推翻这个?

编辑:

至于选项A,我引用从Javascript这个特殊的语法:好的部分

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是为了复制这句法一个人为的例子。

+0

'功能'总是会比调用'对象'吃更多的资源。 –

+5

第一个不行。它返回一个函数,它除了定义和放弃另外两个函数外什么也不做。 –

+0

@NicholasHazel如果函数是在一个对象中呢? – Julio

回答

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它看起来像这样:

- >新范围 - >分配一些瓦尔 - >创建一个函数 - >编译该函数 代码 - >返回功能,关闭范围 - >运行功能 - >新范围 - >创建对象 - >返回对象,关闭范围

- >新范围 - > assi gn一些变量 - >创建对象 - >返回对象,关闭范围

很明显,第一步有更多的步骤,但速度差异是微不足道的。

但是,在某些情况下,返回具有多个嵌套属性和必须初始化的本地函数的复杂对象是不切实际的。在这种情况下,生成对象并将其按需返还将更有用。选项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/

+0

JavaScript中没有类。如果* returnObjectClass *被打算作为构造函数被调用,则它的名字以大写字母开头。函数只是用* new *调用时的构造函数,默认情况下它们返回* this *,所以不需要返回语句,并且约定不包含返回语句。 'this.anotherFunc:function(){};'should perahps be'this.anotherFunc = function(){};',但方法应该在构造函数的原型上,否则它只是一个对象。 – RobG

+0

你说的都是对的。我现在正在纠正。 –