1. 概念
IIFE(Immediately-Invoked Function Expression)指的是立即执行函数或者立即调用的函数表达式,即声明的同时就要调用。
普通函数声明:
function a(){
return 5
};
a();
IIFE:
(function a(){
return 5
})();
由以上对比可以看出 IIFE 主要包含两部分。
第一部分是包围在圆括号运算符 () 里的一个匿名函数,这个匿名函数拥有独立的词法作用域。这不仅避免了外界访问此 IIFE 中的变量,而且又不会污染全局作用域。
第二部分再一次使用 () 创建了一个立即执行函数表达式,JavaScript 引擎到此将直接执行函数。
2. 作用
那么为什么要使用 IIFE 呢,有什么作用呢?
IIFE 是为了弥补 JavaScript 在 scope 作用域方面的缺陷。JS 中的函数作用域只有全局作用域和函数作用域。ES6 之后才有了块级作用域。所以作用域的隔离只能通过 function。而有些函数只需要执行一次,所以名字都可以省了。
IIFE 的作用如下:
- 避免作用域命名污染
- 提升性能(减少了对作用域的查找)
- 避免全局命名冲突
- 保存闭包状态
3. 应用场景
任何需要作用域隔离的场景都可以使用 IIFE。
比如单例模式:
var myModule = (function module(){
var someThing = "123";
var otherThing = [1,2,3];
function doSomeThing(){
console.log(someThing);
}
function doOtherThing(){
console.log(otherThing);
}
return {
doSomeThing:doSomeThing,
doOtherThing:doOtherThing
}
})();
myModule.doSomeThing();
myModule.doOtherThing();
4. 总结
- 创建块级(私有)作用域,避免变量污染和命名冲突。
- IIFE 中定义的任何变量和函数,都会在执行结束时被销毁,减少闭包占用的内存。