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

揭示模块模式中val变量的存储位置及能否直接访问的技术疑问

揭示模块模式中变量存储相关问题解答

1. val 的存储位置

val 存储在 createCounter 函数每次调用时创建的独立函数作用域 里。

当你调用 createCounter() 时,JavaScript 会为这个函数调用生成一个专属作用域,let val = 0 就在这个作用域内声明。虽然函数执行完毕后会退出,但返回的 increment 和 getVal 方法会通过闭包持有对该作用域的引用,导致这个作用域不会被垃圾回收机制销毁,val 也就一直保存在这里。你打印 counter1 或 counter2 看到的只是返回的普通对象,这个对象本身并不包含 val 属性——val 是被闭包“隐藏”在函数作用域中的。

2. counter1 和 counter2 的 val 是否独立?

完全独立。

每调用一次 createCounter(),就会生成一个全新的函数作用域,每个作用域里的 val 都是独立的变量,彼此没有任何关联。比如你给 counter1 调用两次 increment 后,它的 val 变为2,但 counter2 的 val 还是初始的0,这就是最直接的证明。

3. 能否直接打印对应 counter1 和 counter2 的 val?

不能直接访问。

val 是用 let 声明在 createCounter 的局部作用域里的私有变量,外部作用域(比如全局)没有权限直接访问它。你只能通过返回的 getVal() 方法间接获取 val 的值,这也是揭示模块模式实现私有成员的核心逻辑。


代码示例

function createCounter() {
    let val = 0;
    return {
        increment() { val++ },
        getVal() { return val }
    }
}

let counter1 = createCounter();
counter1.increment();
console.log(counter1.getVal()); // 1
counter1.increment();
console.log(counter1.getVal()); // 2


let counter2 =  createCounter();
console.log(counter2.getVal()) // 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:05:47