javascript - 对 JavaScript 闭包的工作原理感到困惑

标签 javascript closures

我认为这是一个愚蠢的问题,但考虑到这段 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/

相关文章:

javascript - 为什么粘贴时 "javascript:"伪协议(protocol)从 URL 栏中剥离?

javascript - 如何将事件处理程序添加到单击按钮时呈现的元素?

javascript - Angular 替换 $scope 和 $apply 中的数组不起作用

ios - 使用 Shark Food 静音开关的 Swift 闭包语法?

循环内的 JavaScript 闭包——简单实用的例子

gradle - Gradle和插件扩展关闭执行顺序

javascript - 调试 Mixpanel track_forms

javascript - 如何自定义浏览器网络推送通知正文和图标?

ios - 如何在 swift 的闭包中抛出错误?

javascript - 在 Javascript 中具有自调用函数的范围