JS 对于闭包的理解不够彻底?

作者站长头像
站长
· 阅读数 6

JS代码

function fn() {
  var num = 3;
  return function() {
      var n = 0;
      n++;
      num++;
      console.log('n=' + n);
      console.log('num=' + num);
  }
}

var fn1 = fn();
fn1(); // 1 4
console.log("------");
fn1(); // 1 5

变量 num 在函数执行完毕后没有被销毁,当我第二次调用 fun1 的时候输出 num=5,而变量 n 每次执行时都会创建一个新的,导致两次调用输出都是 1,这是为什么?同样都是函数内部的变量变量 num 在执行过程中是如何被保留下来的?

回复
1个回答
avatar
test
2024-06-20
当一个函数可以通过某种方式访问其它函数内部变量时,闭包就形成了

你每次执行fn1,里面的var n = 0,都把n初始化为0了。

fn其实也遵循这个规律,函数都这样。

但是,你的fn在复赋值给fn1之后,就没有再执行了。所以里面的num没有被重新赋值,又由于闭包的作用让它不会被销毁(语言引擎特性),使得你在每次调用fn1都可以访问到它累积起来的值。

回到开头的话,你的fun1就有能力访问fn内部的num。也就形成了闭包。闭包的特性就使得num不会被销毁(因为外面有函数可能会访问num,不销毁才合理)。

function fn() {
  var num = 3;
  // 这里加一个console.log
  console.log('outer num', num);
  return function() {
      var n = 0;
      n++;
      num++;
      console.log('n=' + n);
      console.log('num=' + num);
  }
}

// 连续调用两次看看,num的表现和n是一样的
fn()
fn()

附一下阮一峰的闭包文章(阮一峰,我的hero!)

学习Javascript闭包(Closure)

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容