我应该在哪里定义Javascript闭包?
我正在创建我自己的类似JavaScript数组的对象,并且我有调用闭包的方法。我只是想知道在哪里定义闭包最有效 例如,假设我有一个map函数和一个chop函数:我应该在哪里定义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
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。我对此进行了升级,但我不愿意为微不足道的改进添加新模式。可能是过早的优化。如果这再次咬到我,我会应用这个模式来修复瓶颈。