You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript闭包疑问:为何调用原函数后外部变量值未改变?

问题解析:闭包与函数调用的独立作用域

先看你写的代码:

function num() {
    let number = 0;
    console.log(number)
    return function() {
        return number++
    }
}

核心原因:每次调用num()都会生成全新的作用域和变量

  • 执行let add = num()时,num()会完整跑一遍逻辑:创建局部变量number并赋值为0,打印0,然后返回内部函数。这个内部函数形成闭包,会绑定当前这次num()调用时生成的number变量。
  • 之后多次调用add(),修改的都是这个被闭包绑定的number,所以能得到递增的值。
  • 但再次调用num()时,相当于重新执行了一遍num的逻辑:会重新创建一个全新的let number = 0,和之前add()绑定的number是完全独立的两个变量,所以控制台还是输出0,返回的新函数也会绑定这个新的number。

实际验证示例

你可以试试这段代码,更直观感受:

let add1 = num(); // 控制台打印0
add1(); // 返回0,此时add1绑定的number变为1
add1(); // 返回1,number变为2

let add2 = num(); // 控制台打印0,这里的number是新创建的,和add1的无关
add2(); // 返回0,这个number变为1

能明显看到add1和add2操作的是完全隔离的变量,互不影响。

总结

闭包保存的是函数单次调用时的作用域变量,而非函数本身的变量。每次调用外层函数num(),都会生成全新的作用域和局部变量,这些变量之间完全独立,不会互相干扰。

内容的提问来源于stack exchange,提问作者Sopo1805

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:09:54