javascript 通过函数作用域和闭包机制实现私有变量。具体做法是在外层函数中定义变量,并返回一个内部函数(或对象方法),该内部函数引用了外层函数的变量。由于外部无法直接访问外层函数的局部变量,只有通过返回的内部函数才能读写这些变量,从而形成私有状态。

createCounter如何封装计数逻辑
使用工厂模式创建一个计数器对象,利用闭包保存 count 变量。调用 createCounter() 会返回包含 increment 和 getCount 方法的对象。每次调用 increment 都会修改内部的 count,而 getCount 读取当前值。外部代码无法直接修改 count,只能通过接口操作。

function createCounter() {
let count = 0;
return {
increment: function() {
count++;
return count;
},
getCount: function() {
return count;
}
};
}
const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.getCount()); // 2
// console.log(counter.count); // undefined
多个实例间的数据隔离效果
每个通过 createCounter 创建的实例都拥有独立的闭包环境。这意味着不同实例之间的 count 变量互不干扰。即使它们共享相同的函数定义,但引用的内存地址不同。这证明了闭包不仅实现了私有化,还保证了状态隔离。

const counterA = createCounter(); const counterB = createCounter(); counterA.increment(); console.log(counterA.getCount()); // 1 console.log(counterB.getCount()); // 0
循环中绑定索引变量的常见陷阱
在 for 循环中创建闭包时,如果直接使用循环变量 i,所有闭包将共享同一个 i 的引用。当循环结束时,i 的值是最终值,导致所有回调输出相同的结果。解决方法是使用 let 声明循环变量,使其在每个迭代块中创建新的绑定,或者使用立即执行函数表达式(IIFE)捕获当前值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











