每次调用Foo
时,Foo()
中的匿名函数是否会在内存中重新创建?
function Foo(product)
{
return function(n) {
return n * product;
}
}
我对V8的实现或多或少感兴趣,因为我在规范中没有看到任何关于它的内容(除非我遗漏了一些东西,我可能是这样)。
我对正在进行的内存管理感到困惑,因为product
的使用特定于返回的闭包;但是,这并不一定说内部函数有与闭包实例一起重新创建(理论上),因为你仍然可以.bind()
而不会丢失闭包值。
答案 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
可能有解释器优化可以在内部重用已解析的函数,但从纯javascript的角度来看,每次都会创建一个新的函数。
答案 1 :(得分:2)
是。 ECMAScript规范5ed要求对函数表达式或函数声明的每个求值都生成一个新的函数对象。如果您阅读http://es5.github.io/#x13的案例,则它们都包含短语“新的函数对象”
这只是意味着有一个新的Function对象,但该函数对象的大部分内部内容可以在实例之间共享,包括为函数体生成的代码。新对象只需要保存product
变量的值和对共享函数实现的引用。
答案 2 :(得分:1)
据我所知,每次都会重新创建一个新的函数对象,但函数的代码(正文)通常会被重用。我不知道在什么情况下它不会。
https://groups.google.com/forum/#!topic/v8-users/BbvL5qFG_uc