我正在创建自己的类似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) };
}
答案 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上对于“关闭内存使用率”的评价非常高,我不认为它符合条件。这是一个难以诊断的问题。
这里的答案更多是隐藏闭包内功能的一个例子,但它增加了维护存储空间来存储这些私有变量的成本。