0

鉴于以下两个:

方案 1

function inner() {
  // a bunch of code that does stuff
}
function outer() {
  inner();
}
for(var i = 0; i < 10000; i++) {
  outer();
}

方案 2

function outer() {
  function inner() {
    // a bunch of code that does stuff
  }
  inner();
}
for(var i = 0; i < 10000; i++) {
  outer();
}

毫无疑问,这两种情况下的行为是相同的。但是引擎盖下有什么区别?在场景 2 中,口译员做了多少额外的工作(如果有的话)?记忆有没有影响。或者说,如果身体inner()变长,会增加对性能的影响吗?

请不要问“你为什么要这样做”,因为我的问题不是关于实际问题。只是试图更深入地了解 JS 函数是如何解析和表示的。谢谢!

4

2 回答 2

1

但是引擎盖下有什么区别?在场景 2 中,口译员做了多少额外的工作(如果有的话)?

它完全取决于 JavaScript 引擎。(我不再称它们为“解释器”,因为它们中的许多实际上是即时编译的。)

理论上,引擎可能会inner在每次进入outer. 或者至少,inner为每次调用分配一个新的outer.

对于现代引擎,更可能的情况是代码inner编译一次,然后重用,并且为每次调用创建一个新的函数对象,在outer不同的执行上下文中重用该代码。这种影响可以忽略不计(考虑一下您{}在 JavaScript 函数中编写的频率,而不用担心创建对象的影响)。当然,这就是 V8(Chrome 中的引擎)在大多数情况下所做的事情,而且几乎可以肯定大多数现代引擎所做的事情。

于 2012-11-08T00:10:58.260 回答
1

有很多引擎:http ://en.wikipedia.org/wiki/List_of_ECMAScript_engines

其中一些是 JIT 编译,因此比其他在运行时解释的要快。对于 JIT 编译器(编译inner一次并重用),性能下降可以忽略不计,但对于解释器(解释inner多次)来说很明显。inner身体长大时更明显。

于 2012-11-08T00:45:34.330 回答