匿名函数和内存消耗

时间:2010-11-29 00:11:57

标签: javascript function

就内存消耗而言,这些是等价的还是我们为后者的每个对象获取一个新的函数实例?

var f=function(){alert(this.animal);}
var items=[];
for(var i=0;i<10;++i)
{
    var item={"animal":"monkey"};
    item.alertAnimal=f;
    items.push(item);
}

var items=[];
for(var i=0;i<10;++i)
{
    var item={"animal":"monkey"};
    item.alertAnimal=function(){alert(this.animal);};
    items.push(item);
}

修改

我认为为了使闭包正常工作,第二个实例确实会在每次传递时创建一个新函数。这是对的吗?

2 个答案:

答案 0 :(得分:5)

您应该使用第一个方法,因为第二个方法每次解释器传递该行时都会创建一个函数。

关于你的编辑:我们一直处于相同的范围,因为JavaScript具有函数范围而不是块范围,所以这个可能可以优化,但我没有遇到没有实现的实现每次创建它。我建议不要依赖这个(可能是可能的)优化,因为如果你广泛使用这种技术,那么缺乏支持的实现可能会超出内存限制(这很糟糕,因为你不知道将运行什么实现,对吧?)。

答案 1 :(得分:1)

我不是专家,但在我看来,不同的javascript引擎可能会以不同的方式处理它。

例如,V8有一些称为隐藏类的东西,它们在访问同一属性时可能会影响内存消耗。也许有人可以证实或否认这一点。