JavaScript 函数闭包

在浏览器控制台中执行以下代码,输出的结果是什么,请详细解释,并举例扩展说明

function test() {
  var n = 4399;
  function add() {
    n++;
    console.log(n);
  }
  return { n: n, add: add };
}

var result = test(); 
var result2 = test();
result.add();
result.add(); 
console.log(result.n); 
result2.add();

输出结果是 4400 4401 4399 4400 ,为什么 result.add(); 不会影响 result.n 的值

var result = test();

result 变成下面这样,这里面的 n++ ,会改变 result 的属性 n 的值吗

{ 
    n: 4399, 
    add: function() {
        n++;
        console.log(n);
    }
}

而经过 result.add(); 为什么 n 的值又会保留下来呢

img

闭包是指一个函数以及其捆绑的周边环境状态的引用的组合。闭包让开发者可以从内部函数访问外部函数的作用域。在这个例子中,函数 test() 返回了一个对象,该对象包含两个属性:n 和 add。n 的值为 4399,而 add 是一个函数,它将 n 的值加一并将结果打印到控制台上。在主程序中,我们调用了两次 test() 函数,并将结果分别存储在变量 result 和 result2 中。然后我们调用了两次 result.add(),并将结果打印到控制台上。最后我们打印了变量 result.n 的值,并调用了一次 result2.add()。运行结果如下:
4400
4401
4400
第一次调用 result.add() 时,变量 n 的值从 4399 变为了 4400,因此第一行输出的是 4400。第二次调用时,变量 n 的值从 4400 变为了 4401,因此第二行输出的是 4401。第三次调用时,我们使用了变量 result2.add(),但是由于它与变量 result.add() 不是同一个闭包,因此它不会影响变量 result.n 的值。因此第三行输出的是 4400。

闭包的用途有很多,其中最常见的用途是隐藏变量,避免全局污染。闭包还可以读取函数内部的变量,同时在内存中维持一个变量。还可以使用闭包来处理异步编程中的回调函数。

这个问题主要就是演示add每次掉用都会修改闭包变量让它+1,别的没啥都很简单