JavaScript中的立即执行函数,也常被称作IIFE(Immediately Invoked Function Expression),是一种定义后就会自动执行的函数形式,不需要开发者额外手动调用即可完成执行。这种函数形式在实际开发中非常实用,尤其是在需要隔离作用域、避免全局变量污染的场景下。

立即执行函数的两种常见定义方式
立即执行函数的本质是将函数声明转换为函数表达式,再通过后面的括号触发执行,常见的定义方式有两种。
方式一:用括号包裹函数体
这种方式是将整个函数定义放在一对小括号中,将其转为函数表达式,再在后面添加执行括号。
(function() {
// 函数内部逻辑
const innerVar = '我是立即执行函数内部的变量';
console.log(innerVar);
})();
方式二:在函数前添加一元运算符
除了用括号包裹,还可以在函数前添加!、+、-、~等一元运算符,将函数声明转换为函数表达式,之后添加执行括号即可。
!function() {
const testVal = 100;
console.log('函数执行结果:' + testVal);
}();
+function() {
console.log('使用+运算符定义的立即执行函数');
}();
立即执行函数的执行时机
立即执行函数的执行时机非常明确,就是在函数定义完成之后,代码运行到该定义位置时就会立刻执行,不需要等待其他事件触发,也不需要手动调用。
我们可以通过下面的代码示例来验证执行时机:
console.log('代码开始执行');
(function firstIIFE() {
console.log('第一个立即执行函数执行');
})();
console.log('第一个立即执行函数执行完成后');
(function secondIIFE() {
console.log('第二个立即执行函数执行');
})();
console.log('代码执行结束');
上述代码的执行结果会按照以下顺序输出:
- 代码开始执行
- 第一个立即执行函数执行
- 第一个立即执行函数执行完成后
- 第二个立即执行函数执行
- 代码执行结束
从结果可以看出,立即执行函数会在代码运行到其定义位置时立刻执行,执行完成后再继续运行后续的代码。
立即执行函数的典型使用场景
立即执行函数最常见的使用场景是创建独立的作用域,避免内部变量污染全局作用域。比如在早期的前端开发中,经常会用立即执行函数包裹代码逻辑:
(function() {
// 这里的变量不会泄露到全局
const moduleName = '用户管理模块';
let userCount = 0;
function addUser() {
userCount++;
console.log(moduleName + '当前用户数:' + userCount);
}
// 可以在函数内部暴露需要的内容
window.getUserCount = function() {
return userCount;
};
})();
// 全局环境无法访问内部变量
console.log(typeof userCount); // 输出 undefined
console.log(window.getUserCount()); // 输出 0
另外,立即执行函数也可以用来解决循环中闭包的作用域问题,不过随着let关键字的普及,这类场景的使用已经有所减少。
注意事项
定义立即执行函数时,需要注意函数必须是函数表达式,不能直接使用函数声明的形式添加执行括号,否则会抛出语法错误。比如下面的写法是错误的:
// 错误写法,会报语法错误
function test() {
console.log('错误示例');
}();
这种情况下,JavaScript引擎会将function test() {}解析为函数声明,后面的()会被当作分组运算符,从而导致语法错误。因此必须先通过括号或一元运算符将函数转为表达式再执行。
JavaScriptIIFE立即执行函数函数定义执行时机修改时间:2026-06-14 05:15:12