是否重新编译了javascript中的闭包

dis*_*cer 16 javascript performance closures

假设我们有这段代码(暂时忘记原型):

function A(){
  var foo = 1;
  this.method = function(){
    return foo;
  }
}
var a = new A();
Run Code Online (Sandbox Code Playgroud)

是每次运行函数A时重新编译的内部函数?或者更好(以及为什么)这样做:

function method = function(){ return this.foo; }
function A(){
  this.foo = 1;
  this.method = method;
}
var a = new A();
Run Code Online (Sandbox Code Playgroud)

或者javascript引擎是否足够智能,不会每次都创建一个新的"方法"功能?特别是Google的v8和node.js.

此外,欢迎任何关于何时使用哪种技术的一般性建议.在我的具体示例中,使用第一个示例非常适合我,但我知道外部函数将被多次实例化.

gna*_*arf 7

根据我的理解,这不是一个"编译"功能的问题,因为它每次执行时都有不同的"范围".

您使用的第二种方法将始终具有method相同的范围.

第一种方法放在函数调用method的范围内A().因此,该范围内的任何信息(var foo,函数参数等)都存储在函数范围的该实例中.因此,每次都会引用相同的功能代码,但它将在不同的范围内(因此它们是不同的"对象").