小数点儿_ 2023-04-08 09:29 采纳率: 83.3%
浏览 51

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

  • 写回答

3条回答 默认 最新

  • 创意程序员 2023-04-08 09:55
    关注

    闭包是指一个函数以及其捆绑的周边环境状态的引用的组合。闭包让开发者可以从内部函数访问外部函数的作用域。在这个例子中,函数 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。

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

    评论

报告相同问题?

问题事件

  • 修改了问题 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题