嵌套函数声明是否每次调用都会创建一个新对象?

时间:2014-05-24 01:53:54

标签: javascript v8

每次调用Foo时,Foo()中的匿名函数是否会在内存中重新创建?

function Foo(product)
{
    return function(n) {
        return n * product;
    }
}

我对V8的实现或多或少感兴趣,因为我在规范中没有看到任何关于它的内容(除非我遗漏了一些东西,我可能是这样)。

我对正在进行的内存管理感到困惑,因为product的使用特定于返回的闭包;但是,这并不一定说内部函数与闭包实例一起重新创建(理论上),因为你仍然可以.bind()而不会丢失闭包值。

3 个答案:

答案 0 :(得分:3)

此代码段显示您每次都会获得一个新的Function对象:

function Foo(product)
{
    return function(n) {
        return n * product;
    }
}

var a = Foo(2);
var b = Foo(2);

alert(a === b);    // alerts false

演示:http://jsfiddle.net/wc5Lv/


可能有解释器优化可以在内部重用已解析的函数,但从纯javascript的角度来看,每次都会创建一个新的函数。

答案 1 :(得分:2)

是。 ECMAScript规范5ed要求对函数表达式或函数声明的每个求值都生成一个新的函数对象。如果您阅读http://es5.github.io/#x13的案例,则它们都包含短语“新的函数对象”

这只是意味着有一个新的Function对象,但该函数对象的大部分内部内容可以在实例之间共享,包括为函数体生成的代码。新对象只需要保存product变量的值和对共享函数实现的引用。

答案 2 :(得分:1)

据我所知,每次都会重新创建一个新的函数对象,但函数的代码(正文)通常会被重用。我不知道在什么情况下它不会。

https://groups.google.com/forum/#!topic/v8-users/BbvL5qFG_uc