一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何利用函数表达式实现模块化封装

时间:2026-07-16 08:46:58 编辑:袖梨 来源:一聚教程网

核心是用IIFE创建私有作用域,通过返回对象暴露有限接口;括号确保立即执行,防止误判为函数声明;可传入依赖项实现依赖注入;利用闭包维持私有变量;支持多实例隔离与UMD兼容。

核心是用立即执行函数表达式(IIFE)创建私有作用域,把变量和函数关在里面,只通过返回的对象暴露有限接口。

用 IIFE 构建独立作用域

函数表达式加括号后立刻执行,形成一个封闭环境,内部声明的变量、函数不会跑到全局去。这是封装的前提。

  • 标准写法:(function() { /* 私有逻辑 */ })();
  • 括号不能省——防止 JS 引擎误判为函数声明
  • 可传入依赖项,比如 windowjQuery 或工具函数,既方便压缩,也明确外部依赖

只暴露可控的公共接口

模块必须主动返回一个对象,这个对象就是外界唯一能接触到的部分。它不等于内部全部,只是精心挑选的“窗口”。

  • 返回普通方法集合:return { init() {}, getData() {} };
  • 支持链式调用:方法里返回 this 或新对象即可
  • 避免直接暴露原始数据,比如不要 return { count },而应提供 getCount()setCount()

利用闭包实现真正的私有成员

在 IIFE 内部定义的变量,默认对外不可见;只有返回对象中引用的函数,才能持续访问它们——这就是闭包赋予的“特权”。

  • 例如:let token = null; 在外层无法读写,但 getToken()setToken() 可以操作它
  • 每次调用该函数表达式,都会生成一套全新的私有状态,互不干扰
  • 多个模块共享状态?可以传入同一个对象作为参数,在闭包外协调

配合依赖注入提升灵活性

把 jQuery、工具库等依赖作为参数传进 IIFE,而不是硬编码引用,让模块更易测试、替换和压缩。

  • 示例:(function($, utils) { /* 使用 $ 和 utils */ })(jQuery, myUtils);
  • 开发时用全名,生产环境可被压缩工具缩成单字母(如 j),减小体积
  • 结合 UMD 模板,一份代码同时适配浏览器全局、AMD、CommonJS 环境

热门栏目