揭示模块模式中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
相关产品推荐
相关产品推荐

