// 创建模块
const counterModule = (function () {
let counter = 0;
// 私有函数,外部无法直接访问
function reset() {
counter = 0;
}
// 公开函数,用于增加计数器
function increment() {
counter++;
return counter;
}
// 公开函数,用于减少计数器
function decrement() {
counter--;
return counter;
}
// 返回公开函数,形成闭包
return {
increment,
decrement
};
})();
// 利用函数作为命名空间实现数据封装的阐述:
// 在这个模块中,通过立即执行函数表达式 (IIFE) 创建了一个函数作用域。
// 这个函数作用域就成为了一个命名空间。
// 变量 `counter` 和函数 `reset` 都定义在这个命名空间内部,外部代码无法直接访问它们。
// 而通过返回一个包含 `increment` 和 `decrement` 函数的对象,这两个函数可以访问并操作命名空间内的 `counter` 变量,因为它们形成了闭包。
// 闭包使得 `increment` 和 `decrement` 函数即使在外部调用,也能访问到定义在父函数(即命名空间函数)中的 `counter` 变量,从而实现了数据的封装,保证了 `counter` 和 `reset` 的私密性。