2016-09-03 53 views
0

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

回答

1

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

0

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

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

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

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

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