MST

星途 面试题库

面试题:JavaScript 函数作为命名空间隔离策略下的闭包与数据封装

基于函数作为命名空间隔离策略,创建一个模块,其中有一个计数器 `counter` 初始值为 0 ,通过闭包实现两个对外公开的函数 `increment` 和 `decrement` 来分别对计数器进行加一和减一操作,同时模块内有一个私有函数 `reset` 用于将计数器重置为 0 ,但不允许外部直接访问 `reset` 函数。请阐述这里面是如何利用函数作为命名空间实现数据封装的。
11.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
// 创建模块
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` 的私密性。