所以我理解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()
的返回值创建多个项目,这很棒!然而,幕后究竟发生了什么。
是否使用函数返回原始变量的引用....或者隐藏了一些副本?究竟发生了什么?
答案 0 :(得分:4)
是否使用函数返回原始变量的引用....或者隐藏了一些副本?实际上发生了什么?
基本上,是的。返回的函数带有它的封闭范围,其中包括该范围内的变量。它不是这些变量的副本 - 它是范围本身。这就是封闭的本质。
答案 1 :(得分:0)
变量a
仍由函数bar
引用。
答案 2 :(得分:0)
要了解闭包,您需要了解嵌套作用域。 每个函数都有自己的范围,将其视为可以在外部访问的私有空间,但函数外部无法访问函数的私有范围。 当foo被执行时,处理器尝试在foo的本地范围内查找名为“a”的变量,如果它找到一个很好的变量,它会使用它;如果没有,它会查找名为a的变量的链,依此类推,直到达到全局范围。 在这个例子中,变量“a”在upper函数中找到,并且它被使用了 请注意,即使您设置了
var a =3;
在全局范围内,条形函数执行仍会打印2,