元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
执行上下文
▶
创建过程
变量对象
作用域链
This绑定
▶
执行阶段
执行栈机制
词法环境
闭包实现
▶
内存管理
▶
内存模型
堆栈结构
内存分配
内存泄漏
▶
回收机制
标记清除
引用计数
代际假说
▶
事件循环
▶
运行机制
调用栈解析
任务队列
微任务优先
▶
异步处理
Promise原理
Async/Await
Web Workers
▶
原型系统
▶
原型基础
原型链机制
__proto__属性
构造函数
▶
类继承
ES6类语法
继承实现
super关键字
▶
类型系统
▶
基础类型
类型检测
装箱拆箱
类型转换
▶
高级类型
Symbol特性
BigInt实现
类型数组
▶
作用域与闭包
▶
作用域体系
词法作用域
动态作用域
作用域链生成
▶
闭包机制
闭包存储结构
IIFE模式原理
内存泄漏防范
发布时间:
2025-03-22 12:01
↑
☰
# JavaScript IIFE模式原理详解 本文将深入讲解JavaScript中的IIFE(Immediately Invoked Function Expression)模式,包括其工作原理、使用场景和最佳实践。 ## IIFE基础 ### 1. 概念定义 ```javascript class IIFEBasics { static demonstrate() { // 基本IIFE模式 (function() { const message = "Hello from IIFE!"; console.log(message); })(); // 带参数的IIFE (function(name) { console.log(`Hello, ${name}!`); })("Alice"); // 箭头函数IIFE (() => { console.log("Arrow function IIFE"); })(); // 带返回值的IIFE const result = (function() { return "IIFE result"; })(); console.log(result); // "IIFE result" } } ``` ### 2. 执行原理 ```javascript class IIFEExecution { static demonstrate() { // 1. 函数声明转换为表达式 function normalFunction() {} // vs (function iife() {}); // 2. 立即执行 (function() { console.log("Executed!"); }()); // 或 (function() { console.log("Also executed!"); })(); // 3. 其他包装方式 !function() { console.log("Using ! operator"); }(); +function() { console.log("Using + operator"); }(); void function() { console.log("Using void operator"); }(); } } ``` ## 作用域隔离 ### 1. 变量隔离 ```javascript class VariableIsolation { static demonstrate() { var globalVar = "global"; (function() { var globalVar = "local"; console.log(globalVar); // "local" })(); console.log(globalVar); // "global" // 避免全局污染 (function() { // 这里的变量都是局部的 const config = { apiUrl: "https://api.example.com", timeout: 5000 }; function initialize() { console.log("Initializing with", config); } initialize(); })(); } } ``` ### 2. 模块化封装 ```javascript class ModuleEncapsulation { static demonstrate() { // 模块模式 const Counter = (function() { let count = 0; // 私有变量 function increment() { return ++count; } function decrement() { return --count; } return { increment, decrement, getCount: () => count }; })(); console.log(Counter.increment()); // 1 console.log(Counter.increment()); // 2 console.log(Counter.decrement()); // 1 console.log(Counter.getCount()); // 1 } } ``` ## 实际应用 ### 1. 单例模式 ```javascript class SingletonPattern { static demonstrate() { const Database = (function() { let instance; function createInstance() { const object = { data: new Map(), insert(key, value) { this.data.set(key, value); }, get(key) { return this.data.get(key); } }; return object; } return { getInstance() { if (!instance) { instance = createInstance(); } return instance; } }; })(); const db1 = Database.getInstance(); const db2 = Database.getInstance(); console.log(db1 === db2); // true } } ``` ### 2. 初始化函数 ```javascript class Initialization { static demonstrate() { // DOM初始化 (function initializeApp() { function setupEventListeners() { document.querySelectorAll('.button') .forEach(button => { button.addEventListener('click', handleClick); }); } function handleClick(event) { console.log('Button clicked:', event.target.id); } // 初始化代码 setupEventListeners(); console.log('Application initialized'); })(); // 配置初始化 const AppConfig = (function() { const defaultConfig = { theme: 'light', language: 'en', notifications: true }; function loadUserConfig() { return JSON.parse(localStorage.getItem('userConfig') || '{}'); } const userConfig = loadUserConfig(); const config = { ...defaultConfig, ...userConfig }; return { getConfig() { return { ...config }; }, setConfig(newConfig) { Object.assign(config, newConfig); localStorage.setItem('userConfig', JSON.stringify(config)); } }; })(); } } ``` ## 性能优化 ### 1. 依赖注入 ```javascript class DependencyInjection { static demonstrate() { const Service = (function($) { function fetchData(url) { return $.ajax({ url, method: 'GET' }); } function processData(data) { return data.map(item => item.id); } return { getData(url) { return fetchData(url).then(processData); } }; })(jQuery); // 测试版本 const TestService = (function(mockAjax) { return Service({ ajax: mockAjax }); })(function mockAjax() { return Promise.resolve([{id: 1}, {id: 2}]); }); } } ``` ### 2. 缓存优化 ```javascript class CacheOptimization { static demonstrate() { const CacheManager = (function() { const cache = new Map(); const maxAge = 5 * 60 * 1000; // 5分钟 function isExpired(timestamp) { return Date.now() - timestamp > maxAge; } return { get(key) { const item = cache.get(key); if (!item) return null; if (isExpired(item.timestamp)) { cache.delete(key); return null; } return item.value; }, set(key, value) { cache.set(key, { value, timestamp: Date.now() }); }, clear() { cache.clear(); } }; })(); } } ``` ## 最佳实践 ### 1. 命名空间 ```javascript class NamespacePattern { static demonstrate() { // 不好的实践 - 全局变量 function badPractice() { window.utils = { format() {}, validate() {} }; window.config = { apiUrl: '' }; } // 好的实践 - 命名空间 const APP = (function() { const utils = { format(date) { return new Date(date).toLocaleDateString(); }, validate(email) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); } }; const config = { apiUrl: 'https://api.example.com', timeout: 5000 }; return { utils, config }; })(); } } ``` ### 2. 错误处理 ```javascript class ErrorHandling { static demonstrate() { const SafeModule = (function() { function handleError(error, context) { console.error(`Error in ${context}:`, error); // 可以添加错误报告逻辑 } return { execute(fn, context = 'unknown') { try { return fn(); } catch (error) { handleError(error, context); return null; } }, async executeAsync(fn, context = 'unknown') { try { return await fn(); } catch (error) { handleError(error, context); return null; } } }; })(); // 使用示例 SafeModule.execute(() => { throw new Error('Test error'); }, 'test'); } } ``` ## 总结 IIFE模式的主要特点包括: 1. 执行机制 - 函数表达式立即执行 - 支持多种包装语法 - 可传递参数和返回值 2. 作用域隔离 - 避免全局污染 - 实现变量私有化 - 模块化封装 3. 应用场景 - 单例模式实现 - 初始化函数 - 依赖注入 - 模块化开发 4. 最佳实践 - 合理使用命名空间 - 实现错误处理 - 注意性能优化