这篇文章是对于 JS 中 立即执行函数(IIFE) 的一个概述 :
声明一个函数,并马上调用这个匿名函数就叫做立即执行函数(IIFE);即立即执行函数是定义函数以后 立即执行 该函数,并且在执行完后,会被 立即销毁。
//形式一:用括号把函数定义包裹起来,后面再加括号
(function(param){
console.log(param) //123
})(123);
//形式二:用括号把整个函数定义和调用包裹起来
(function(param){
console.log(param); //123
}(123))
这两种写法是等价的,一个表达式后面加上括号 (),该表达式会立即执行。并且都是以 圆括号开头,引擎会意味后面跟的是 表达式,而不是一个函数定义语句,所以就避免了错误(因为要想立即执行函数做到立即执行,条件之一就是,函数体必须是函数表达式而不能是函数声明)
要想立即执行函数做到立即执行 : - 函数体后面要有小括号();
- 函数体必须是 函数表达式 而不能是函数声明;
- 除了使用 () 运算符之外,!、+、-、= 等运算符都能起到立即执行的作用,这些运算符作用就是将匿名函数或函数声明转化为函数表达式。
解析器解析 function 关键字的时候,默认是认为 function 声明,而不是 function 表达式。JavaScript 语法里括弧 () 里面不能包含语句,所以解析器在解析 function 关键字的时候,会将相应的代码解析成 function 表达式,而不是 function 声明。
//函数声明
function (){
console.log('函数声明');
}
//函数表达式
var test = function(){
console.log('函数表达式');
}
//匿名函数
functioni(){
console.log('匿名函数');
}
立即执行函数会形成一个单独的作用域,我们可以封装一些临时变量或者局部变量,避免污染全局变量。(若想访问全局对象 window,将全局对象以参数形式传进去即可。)
(function(j){
console.log(j);
})(i)//输出 i
如果立即执行函数中需要全局变量,全局变量会被作为一个参数传递给立即执行函数(上例中的 i 就是一个全局变量,i 代表的是 实参,j 是 i 在立即执行函数中的 形参)。
var result = (function(){
var res = 'hello'
return function(){
return res;
}
})()
console.log(result)//输出2
立即执行函数也可以有返回值。除了可以返回 基本类型值 以外,立即执行函数也能返回任何类型的值,比如 对象,函数。