假设我们有一个名为
现在是问题时间。根据《JavaScript 忍者秘籍》一书,每个闭包都会有自己的私有变量集(包括稍后定义的变量,比如
在“私有空间”中,
更新:即使
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 忍者秘籍》一书,每个闭包都会有自己的私有变量集(包括稍后定义的变量,比如
someOuterVariable
):
containerFunction
之外引用innerFunction1
和innerFunction2
时,它们被称为innerFunction1link
和innerFunction2link
,将具有完整的“私有气泡”及其中的所有变量。在“A点”,两个函数都将正常执行,并输出: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
在不同的上下文中定义,它们仍然会“共享”变量。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
someOuterVariable
,我同时更新了内部函数。但现在我明白为什么它能够工作了。特别感谢 Bergi 的看透你的泡沫墙
。 - mishik