You need to enable JavaScript to run this app. JavaScript中闭包的变量值是存储在内存的哪个位置?
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中闭包的变量值是存储在内存的哪个位置?

闭包关联变量的存储位置解答

示例代码

const Component = () => {
    let counter = 0;
    
    const logger = () => {
        console.log(counter);
    }

    setTimeout(() => counter = counter + 10, 1000);

    return logger;
}

const myLogger = Component();

myLogger(); // output after ~1s: 10

解答内容

首先明确结论:被闭包捕获的counter既没有存储在全局执行上下文,也不会随着Component的执行上下文销毁而消失,它存放在堆内存的独立闭包作用域对象中。
具体逻辑如下:

  • 正常情况下,函数执行时内部声明的基础类型变量会分配在当前函数执行上下文的栈空间中,函数执行结束后栈空间随执行上下文一同销毁。
  • 但如果内部函数(也就是示例中的logger)捕获了外层函数的变量,JS引擎会自动将这些被捕获的变量从栈空间转移到堆内存中,封装为一个和闭包绑定的作用域对象。
  • 你提到的myLogger的[[Scopes]]属性持有的引用,指向的就是堆内存里的这个闭包作用域对象,所以即使Component的执行上下文已经被销毁,只要myLogger还存在、没有被垃圾回收,这个作用域对象和里面的counter变量就会一直保留。
  • 全局执行上下文的变量环境中只会存储顶层声明的Component、myLogger变量,不会存放counter,完全不会污染全局作用域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:36:03