我认为这是一个愚蠢的问题,但考虑到这段 JavaScript 代码......
function outerFun()
{
var a=0;
function innerFun()
{
a++;
alert(a);
}
return innerFun;
}
var obj=outerFun();
obj(); //1
obj(); //2
var obj2=outerFun();
obj2(); //1
obj2(); //2
我明白为什么在调用 obj() 的前两次结果是 1 然后是 2,但我很困惑为什么调用 obj() 两次后 obj2() 返回 1 而不是返回 3。
最佳答案
因为每次调用 outerFun()
时,您都在创建一个不同的新执行上下文,所以 innerFun
并不是真正相同的东西,因为每个函数对从 outerFun
返回的 innerFun
的引用处于不同的上下文中,该上下文具有自己的变量。
function outerFun()
{
var a=0;
function innerFun()
{
a++;
alert(a);
}
return innerFun;
}
var obj = outerFun();
var obj2 = outerFun();
console.log(obj === obj2);
// Not equal, because innerFun is a different innerFun for each function call,
// as it is the same function name, returned from the same function,
// but in a different context.
obj(); //1
obj(); //2
obj2(); //1
obj2(); //2
// Call obj twice, it'll increase to 4.
// While calling obj2 once again, leaves it at 3.
// This way you can know that obj and obj2 are not modifying
// the same variables.
// They are independent of each other.
obj(); // 3
obj(); // 4
obj2(); // 3
关于javascript - 对 JavaScript 闭包的工作原理感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30135384/