Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该在哪里定义Javascript闭包?_Javascript_Closures - Fatal编程技术网

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

我应该在哪里定义Javascript闭包?,javascript,closures,Javascript,Closures,我正在创建我自己的类似JavaScript数组的对象,并且我有调用闭包的方法。我只是想知道在哪里定义闭包最有效 例如,假设我有一个map函数和一个chop函数: MyObject.prototype = { map: function(fn) { ... applies fn to each element ... }; chop: function() { this.map( function(element) { ... chop off l

我正在创建我自己的类似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) };
}

它们实际上是同一件事——以可读性更强的为准。就其价值而言,我更喜欢第二种方法。

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

第二个更有效。这个

  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
    };

})();

用一个函数闭包换另一个函数闭包并不会产生更高效的代码。内存效率最高的应该是完全不使用闭包的

__proto__ = {
  map: function(){},
  _chop: function(str){
    return str.slice( str.length, -1 );
  },
  chop: function(arr){ 
    this.map(this._chop, arr);
  }
}
这个问题在google上的“闭包内存使用率”评价很高,我认为它不符合要求。这是一个很难诊断的问题


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

因此,解释器处理这些情况的方式没有什么不同?不完全一样-Allain在他的回答中解释得很好。-1:函数创建的开销可能很小,但每次调用
chop()都会得到它
是的,但我一直在寻找类似克里斯托夫所说的。。。我知道它们是可以忽略不计的,但我仍然很好奇哪一个更有效,不管有多小。@Allain:只有在对应用程序进行基准测试之后,您才能知道哪些东西是可以忽略不计的;可能是
chop()
将被调用数百万次,这意味着必须创建数百万个不必要的函数对象(并进行垃圾收集)。这不是一个笼统的语句。随着元素数量的增加,创建函数与调用函数的相对成本将降低。当然,我同意你的观点,你应该始终为你的代码将在其中运行的特定环境进行基准测试。@Allain:每次调用的元素数开销可能是O(1),但调用数仍然是O(n);如果只调用几次
chop()
,开销可以忽略不计;但是当你有很多对
chop()
的调用时,其影响很可能是相关的……对
map()
的调用不应该读
this.map(this.chop)
?对,我错了,我会像这样编辑itI,因为它不会污染“array”的公共接口,并且仍然会破坏chopElement。我对此进行了升级,但我不愿意为微不足道的改进添加新模式。可能是过早的优化。如果这再次咬到我,我会应用这个模式来修复瓶颈。