iife本质上是被括号包裹的函数表达式并立即调用,因javascript引擎将函数声明与表达式区别解析,括号使其转为表达式以避免syntaxerror,从而实现作用域隔离、避免全局污染及模块化封装。

JavaScript 中的 IIFE(Immediately Invoked Function Expression,立即执行函数表达式)本质上是一个被括号包裹的函数表达式,紧随其后加一对调用括号,从而在定义完成的瞬间就运行。它不是函数声明,也不依赖变量赋值,核心在于“表达式”身份和“立即调用”的组合。
为什么必须是函数表达式,而不是函数声明
JavaScript 引擎对函数声明和函数表达式的解析规则不同:
- 函数声明会被提升(hoisted),但不能直接加
()执行,否则语法报错:function foo(){}();❌ - 函数表达式不被提升,需先“变成表达式”,常见方式是用小括号
(...)包裹——这告诉引擎:“这不是声明,这是值,可参与运算” - 其他强制转为表达式的方式还有:
!function(){...}()、+function(){...}()、void function(){...}(),原理都是利用一元运算符要求操作数为表达式
IIFE 的标准写法与执行流程
最常用、最清晰的写法是:
(function () {
console.log('我已执行');
})();
执行分两步:
- 第一步:解析
(function(){...})→ 得到一个函数对象(表达式求值结果) - 第二步:紧接着的
()对该函数对象进行调用 → 立即执行函数体
注意:末尾的调用括号 () 是执行操作符,不是函数定义的一部分。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
作用域隔离是 IIFE 的底层机制
IIFE 的真正价值不在“立即执行”,而在于它天然创建一个新的词法作用域:
- 函数内部用
var、let、const声明的变量,只在该函数内有效 - 外部无法访问这些变量,也不会覆盖或污染全局变量(比如
window或globalThis) - 这个新作用域也支持闭包:内部函数可以捕获并持有 IIFE 内部的变量,即使 IIFE 已执行完毕
参数传递与常见变体
IIFE 支持传参,常用于注入全局对象或配置:
(function (global, $) {
console.log(global === window); // true(浏览器中)
console.log(typeof $); // 'function'(若 jQuery 已加载)
})(this, jQuery);
其他合法写法包括:
-
(function(){...}());—— 调用括号放在表达式内部,语义等价 -
!function(){...}();—— 利用逻辑非运算符强制表达式化,返回布尔值(通常忽略) -
~function(){...}();—— 位运算取反,同样起表达式化作用
只要保证引擎识别为表达式,并在其后加 (),就构成有效 IIFE。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










