跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

什么是立即执行函数_它有什么用途

IIFE通过将函数转为表达式实现立即执行,避免全局污染;(function(){})()加括号或用!等运算符可解决语法错误;还能为for循环每次迭代创建独立作用域,解决var闭包变量共享问题。 立即执行函数(IIFE)就是定义完立刻运行的函数,它不污染全局 作用域 ,也不需要手动调用。 为什么写
(function(){})()
而不是直接
function(){}()
JavaScript 解析器会把
function(){}()
当作函数声明,而函数声明不能紧跟括号调用——语法报错
Uncaught SyntaxError: Function statements must have a name
或类似提示。加外层括号
(function(){})()
是把它转成「函数表达式」,表达式才能被立即调用。 正确写法:
(function(){ console.log('run'); })();
、
(function(){})()
、
!function(){console.log('run')}();
错误写法:
function(){}();
(SyntaxError) 单目运算符如
!
、
+
、
-
、
~
也能强制转为表达式,但
!
最常用,因为语义清晰且不会影响返回值 解决 for 循环中闭包变量共享的经典问题 用
var
声明的循环变量在回调里总输出最后一个值,比如
setTimeout
或事件绑定中打印
i
全是
6
。IIFE 可为每次迭代创建独立作用域,把当前
i
封装进去。 Comet AI 浏览器 下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。 下载
(function () { var lis = document.getElementsByTagName('li'); for (var i = 0; i < lis.length; i++) { (function (index) { lis[index].onclick = function () { alert(index); // 正确输出 0,1,2... }; })(i); } })();
ES6 更推荐用
let
替代:它天然块级作用域,
for (let i = 0; i 即可
IIFE 是 ES5 环境下的可靠兜底方案,兼容性好(IE6+ 都支持) 注意传参顺序:必须是
(function(i){...})(i)
,不能漏掉结尾的
(i)
,否则函数定义了但没执行 模块封装与私有变量隔离 IIFE 常用于老项目或轻量脚本中模拟模块,把工具函数、配置、状态变量全关在里面,只暴露必要的接口。
(function (global) { var privateCounter = 0; function increment() { privateCounter++; } function getValue() { return privateCounter; } // 暴露给全局 global.MyCounter = { inc: increment, get: getValue }; })(typeof window !== 'undefined' ? window : global);
privateCounter
外部无法访问,真正私有 第二参数
global
让代码同时兼容 浏览器 和 Node. js 环境 现代项目优先用 ES Module(
import/export
),但 IIFE 在无构建工具的 HTML 页面中仍很实用 真正容易被忽略的是:IIFE 的返回值可以是函数、对象甚至
undefined
,如果想链式调用或赋值,得显式写
return
;另外,多个 IIFE 连续写时,前面必须加分号,否则可能被解析成上一行的调用参数——比如
}())(function(){
会出错。

相关文章