Javascript:是为所有变量创建的闭包,还是只为内部函数可能使用的变量创建的闭包

Javascript: Are closures created for all variables, or only for the ones the inner function might use?

本文关键字:创建 变量 闭包 内部函数 Javascript      更新时间:2023-09-26
var foo = 'outer';
function outer() {
    var foo = 'closure';
    var bar = 'baz';
    return function inner() {
        console.log(foo);
    }   
}

我知道foo将被关闭,因为inner()将需要它。

bar也会被关闭吗?它在inner()的范围内,但inner()没有使用它。

从理论上讲,整个父作用域都是封闭的,包括变量foobar以及对其父作用域的引用:函数inner可能需要它。至少它是这样指定的。在实践中,引擎可以自由地优化这一点,并垃圾收集所有未引用的内容 - 例如,V8 就是这样做的。

特定变量本身不会结转。创建闭包时,整个范围将结转。在这种情况下,foobar以及该作用域中存在的任何变量都将inner函数中可用。