假设我们在containerFunction
其中定义了两个函数:
var innerFunction1link;
var innerFunction2link;
function containerFunction() {
var someInnerVariable = 1;
innerFunction1link = innerFunction1;
innerFunction2link = innerFunction2;
function innerFunction1() {
console.log("I'm 1 " + someOuterVariable + " " + (someInnerVariable++));
}
function innerFunction2() {
console.log("I'm 2 " + someOuterVariable + " " + (someInnerVariable++));
}
}
containerFunction();
var someOuterVariable = 42;
// Point A
innerFunction1link();
innerFunction2link();
someOuterVariable = "WAT?!";
// Point B
innerFunction1link();
innerFunction2link();
现在的问题。根据“JavaScript Ninja 的秘密”一书,每个闭包都有自己的私有变量集(包括后面定义的变量,如someOuterVariable
):
因此innerFunction1
,并且在asinnerFunction2
之外引用,并且将有它们的“私人泡沫”,其中包含全套变量。在“A 点”,两个函数都可以正常执行并输出:containerFunction
innerFunction1link
innerFunction2link
I'm 1 42 1
I'm 2 42 2
然后,当我设置someOuterVariable
为时"WAT?!"
,输出为:
I'm 1 WAT?! 3
I'm 2 WAT?! 4
两个“私人泡沫”的价值someOuterVariable
和someInnerValue
实际更新将如何(如果有 1000 个这些泡沫会怎样)?它实际上是否跟踪对所有变量的所有引用?如果一个闭包更新,它的值将如何填充到另一个闭包?someOuterVariable
更新:
即使innerFunction
's 将在不同的上下文中定义,它们仍然会“共享”变量:
function containerFunction1() {
var someInnerVariable = 1;
innerFunction1link = innerFunction1;
function innerFunction1() {
console.log("I'm 1 " + someOuterVariable + " " + (someInnerVariable++));
}
}
function containerFunction2() {
var someInnerVariable = 1;
innerFunction2link = innerFunction2;
function innerFunction2() {
console.log("I'm 2 " + someOuterVariable + " " + (someInnerVariable++));
}
}
containerFunction1();
containerFunction2();
var someOuterVariable = 42;
innerFunction1link();
innerFunction2link();
someOuterVariable = "WAT?!";
innerFunction1link();
innerFunction2link();
输出:
I'm 1 42 1
I'm 2 42 1
I'm 1 WAT?! 2
I'm 2 WAT?! 2