是否每次调用都重新创建嵌套函数?

时间:2016-09-03 07:37:10

标签: javascript

我很好奇这通常是如何处理的,我认为它主要取决于引擎的实现,但是为了举例,让我们使用chrome,每次调用外部函数时都会重新创建嵌套函数,或者它们只是存储在某个地方,只能在该范围内访问?

2 个答案:

答案 0 :(得分:1)

函数体将被编译一次并存储在某处。但是,如果函数引用任何自由变量,它将在其中有一个闭包环境,每次调用父函数时都会更改,以捕获该调用的变量绑定。

答案 1 :(得分:0)

每次调用外部函数时都会生成内部函数的副本。这不是浏览器优化的问题,而是必需品,因为每个闭包需要保持对在其自己的外部范围内声明的变量的引用。

function outer()
{
  function inner()
  {
  }
  return inner;
}

var inner1 = outer();
var inner2 = outer();

console.log('Inner functions are ' + (inner1 === inner2 ? 'identical' : 'different'));

无论如何,这并不意味着这些实例没有针对引擎级别的性能进行优化,而是在运行时缓存。例如,Chromium缓存函数编译数据和call sites,即代码中发生函数调用的位置,以加快执行速度。