我应该在哪里定义我的Javascript闭包?

时间:2009-02-11 18:54:22

标签: javascript closures

我正在创建自己的类似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 个答案:

答案 0 :(得分: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
    };

})();

答案 1 :(得分:2)

创建函数或查找它都不是JavaScript中昂贵的操作,所以如果你有一个“数组”中有一个相当多的元素,那么任何一种方法之间的差异都可以忽略不计。

答案 2 :(得分:0)

它们实际上是相同的 - 与任何一个更具可读性的东西一起去。对于它的价值,我更喜欢第二个。

答案 3 :(得分:0)

交易函数闭包,对于另一个函数闭包不会导致更高效的代码。最有效的内存就是不使用闭包的那个。

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

这个问题在google上对于“关闭内存使用率”的评价非常高,我不认为它符合条件。这是一个难以诊断的问题。

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