0

我正在创建自己的 JavaScript 类数组对象,并且我有调用闭包的方法。我只是想知道定义闭包的最有效位置在哪里。

例如,假设我有一个 map 函数和一个 Chop 函数:

MyObject.prototype = 
{
  map: function(fn) { ... applies fn to each element ... };

  chop: function() 
  { this.map( 
    function(element) 
    {
      ... chop off last character ... 
    } 
  )};
}

这样做是否更有效率?

MyObject.prototype = 
{
  map: function(fn) { ... applies fn to each element ... };

  __chop: function(element) 
  {
    ... chop off last character ... 
  }

  chop: function() 
  { this.map(this.__chop) };
}
4

4 回答 4

5

第二种效率更高。这

  chop: function() 
  { map( 
    function(element) 
    {
      ... chop off last character ... 
    } 
  )}

将在每次调用时创建一个新的函数对象,并chop()具有相应的运行时和内存开销。由于不会有对新对象的任何延迟引用,因此可以立即将其作为垃圾回收,但创建不必要的更多对象仍然是一种不好的做法。

我建议以下模式:

MyObject.prototype = (function() {

    function map(fn) { ... }

    function chopElement(element) { ... }

    function chop() {
        this.map(chopElement);
    }

    return {
        map : map,
        chop : chop
    };

})();
于 2009-02-11T19:04:11.017 回答
2

在 JavaScript 中创建函数和查找函数都不是成本高昂的操作,因此如果您有一个包含相当数量元素的“数组”,则这两种方法之间的差异可以忽略不计。

于 2009-02-11T19:01:33.037 回答
0

它们实际上是同一件事 - 选择更具可读性的那个。对于它的价值,我更喜欢第二个。

于 2009-02-11T19:00:33.477 回答
0

将函数闭包换成另一个函数闭包不会导致更高效的代码。最节省内存的方法是根本不使用闭包。

__proto__ = {
  map: function(){},
  _chop: function(str){
    return str.slice( str.length, -1 );
  },
  chop: function(arr){ 
    this.map(this._chop, arr);
  }
}

这个问题在谷歌上的“关闭内存使用”率非常高,我认为它不合格。这是一个很难诊断的问题。

这里的答案更多是在闭包中隐藏功能的示例,但它增加了维护该内存空间以存储这些私有变量的成本。

于 2010-10-15T02:16:46.120 回答