代码之家  ›  专栏  ›  技术社区  ›  spender

匿名函数与内存消耗

  •  5
  • spender  · 技术社区  · 14 年前

    在内存消耗方面,这些是等价的还是我们为后者中的每个对象都得到一个新的函数实例?

    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 回复  |  直到 14 年前
        1
  •  5
  •   jwueller    14 年前

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

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

        2
  •  1
  •   micho    14 年前

    我不是专家,但在我看来,不同的javascript引擎可能以不同的方式处理这个问题。

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