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 封装进去。
YXPHP6系统可以看做是一个模版平台,而且它又能独立工作. 而且YXPHP6系统也不需要数据库支持. 你可以开发自己的模板,也可以同步官方的模板后进行自己的二次开发,前提是您对YXPHP6要有一定的了解.YXPHP6不仅可以用作企业建站,甚至是blog,只要是您能想到的,YXPHP6几乎都可以胜任. 因为YXPHP6系统本身与模板之间可以说是独立运行的.也就是说,不管你做什么样的网站或者是应用,
(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(){ 会出错。









