聊一聊JavaScript中的立即执行函数(IIFE)

一、为什么需要IIFE?

假设咱在代码里定义了一个变量:

javascript 复制代码
var a = 2;
function foo() {
    var a = 3;
    console.log("内部a:", a); // 3
}
foo();
console.log("外部a:", a); // 2

看起来没问题对吧?但用函数声明可能会不小心污染全局作用域。于是有人想到:能不能让函数定义完立刻执行,还不用起名字?

这时候IIFE就登场了


二、IIFE的基本套路

核心原理:把函数变成表达式

javascript 复制代码
var a = 2;
// 注意这两个小括号!
(function() {
    var a = 3;
    console.log("偷偷改a:", a); // 3
})(); // 第一个括号把函数变成表达式,第二个括号立刻执行它

console.log("外面的a还是:", a); // 2

关键点:

  • ()包裹函数,让它从"函数声明"变成"函数表达式"
  • 末尾加()立刻调用,不用手动执行
  • 内部变量和外部完全隔离,互不干扰

三、IIFE的进阶玩法

1. 参数传递:把全局对象当快递寄进去

javascript 复制代码
var a = 2;
(function(global) { // 这里收快递
    var a = 3;
    console.log("内部a:", a); // 3
    console.log("外面的a其实在global里:", global.a); // 2
})(window); // 把window当参数传进去

// 好处:不用直接写window,代码更灵活

2. 防坑指南:保护undefined

有时候手贱会干这种事:

javascript 复制代码
undefined = "嘿嘿,我篡改了!"; // 给其他代码挖了个大坑
(function(undefined) { // 这里设个陷阱
    var a;
    if (a === undefined) {
        console.log("这里的undefined很安全!"); // 正常输出
    }
})(); // 不传参数,undefined参数自动变成真正的undefined

原理: 不传参数时,函数内的undefined参数值就是原始undefined,外面的骚操作影响不到里面!

将被undefined标识符的默认值被错误覆盖导致的异常的代码放入即可验证和解决该问题。

3. 顺序控制:把代码倒着写

javascript 复制代码
var a = 2;
// 先定义执行逻辑
(function(def) {
    def(window); // 第二步:执行传进来的函数
})(function(global) { // 第一步:把函数当参数传进去
    var a = 3;
    console.log("内部a:", a); // 3
    console.log("全局a:", global.a); // 2
});

整体逻辑: 函数表达式def定义在片段的第二部分,然后当做参数(这个参数也叫做def)被传递进IIFE函数定义的第一部分,最后参数def(也就是传进去的函数)被调用,并将window传入当做global的参数的值。

适用场景: 比如某个函数需要先准备好才能执行,可以用这种"传参倒序"的方式组织代码。


四、IIFE的日常妙用

场景1:快速创建一个独立沙箱

javascript 复制代码
// 临时需要一个干净的作用域
(function() {
    var tempData = "敏感数据";
    // 这里随便折腾,不会影响外面
})();
// tempData在这里访问不到,自动销毁

场景2:保护第三方库变量

很多库(比如老版本jQuery)会这么写:

javascript 复制代码
(function(window) {
    var privateKey = "保密!";
    window.$ = function() { /* ... */ };
})(window);
// 外面只能访问到$,privateKey被藏起来了

总结:IIFE到底解决了啥?

  • 隔离作用域:关起门来操作变量,不怕和外面冲突
  • 灵活传参:把全局对象、依赖项当参数传递,代码更可控
  • 防止污染:避免不小心修改undefined等特殊值

虽然现在ES6的let/const和模块化逐渐替代了IIFE,但理解它依然能帮你看懂很多老代码的设计思路。下次见到这种(function(){ ... })()结构,你就能会心一笑啦!

相关推荐
未来之窗软件服务2 小时前
一体化系统(九)智慧社区综合报表——东方仙盟练气期
大数据·前端·仙盟创梦ide·东方仙盟·东方仙盟一体化
陈天伟教授6 小时前
人工智能训练师认证教程(2)Python os入门教程
前端·数据库·python
信看6 小时前
NMEA-GNSS-RTK 定位html小工具
前端·javascript·html
Tony Bai6 小时前
【API 设计之道】04 字段掩码模式:让前端决定后端返回什么
前端
爱吃大芒果6 小时前
Flutter 主题与深色模式:全局样式统一与动态切换
开发语言·javascript·flutter·ecmascript·gitcode
苏打水com7 小时前
第十四篇:Day40-42 前端架构设计入门——从“功能实现”到“架构思维”(对标职场“大型项目架构”需求)
前端·架构
king王一帅7 小时前
流式渲染 Incremark、ant-design-x markdown、streammarkdown-vue 全流程方案对比
前端·javascript·人工智能
苏打水com7 小时前
第十八篇:Day52-54 前端跨端开发进阶——从“多端适配”到“跨端统一”(对标职场“全栈化”需求)
前端
Bigger7 小时前
后端拒写接口?前端硬核自救:纯前端实现静态资源下载全链路解析
前端·浏览器·vite