Closure究竟如何记住它的词法范围?

时间:2017-05-17 02:18:46

标签: javascript

所以我理解JavaScript中的Closure做了什么,但我不明白它是如何回忆的。

使用YDKJS书的例子:

function foo() {
    var a = 2;

    function bar() {
        console.log( a );
    }

    return bar;
}

var baz = foo();

baz()//Prints 2

我知道正在返回bar,并且bar可以访问包含a的词法范围。我们可以使用foo()的返回值创建多个项目,这很棒!然而,幕后究竟发生了什么。

是否使用函数返回原始变量的引用....或者隐藏了一些副本?究竟发生了什么?

3 个答案:

答案 0 :(得分:4)

  

是否使用函数返回原始变量的引用....或者隐藏了一些副本?实际上发生了什么?

基本上,是的。返回的函数带有它的封闭范围,其中包括该范围内的变量。它不是这些变量的副本 - 它是范围本身。这就是封闭的本质。

答案 1 :(得分:0)

变量a仍由函数bar引用。

答案 2 :(得分:0)

要了解闭包,您需要了解嵌套作用域。 每个函数都有自己的范围,将其视为可以在外部访问的私有空间,但函数外部无法访问函数的私有范围。 当foo被执行时,处理器尝试在foo的本地范围内查找名为“a”的变量,如果它找到一个很好的变量,它会使用它;如果没有,它会查找名为a的变量的链,依此类推,直到达到全局范围。 在这个例子中,变量“a”在upper函数中找到,并且它被使用了 请注意,即使您设置了

var a =3;

在全局范围内,条形函数执行仍会打印2,