天天看点

对于 JS 中立即执行函数(IIFE)的概述 :

这篇文章是对于 JS 中 立即执行函数(IIFE) 的一个概述 :

  • 概念 :
声明一个函数,并马上调用这个匿名函数就叫做立即执行函数(IIFE);即立即执行函数是定义函数以后 立即执行 该函数,并且在执行完后,会被 立即销毁。
  • 常见形式 :
//形式一:用括号把函数定义包裹起来,后面再加括号
(function(param){
	console.log(param)	//123
})(123);

//形式二:用括号把整个函数定义和调用包裹起来
(function(param){
	console.log(param);	//123
}(123))
           
这两种写法是等价的,一个表达式后面加上括号 (),该表达式会立即执行。并且都是以 圆括号开头,引擎会意味后面跟的是 表达式,而不是一个函数定义语句,所以就避免了错误(因为要想立即执行函数做到立即执行,条件之一就是,函数体必须是函数表达式而不能是函数声明)
  • 需要注意的问题 :
要想立即执行函数做到立即执行 :
  1. 函数体后面要有小括号();
  2. 函数体必须是 函数表达式 而不能是函数声明;
  3. 除了使用 () 运算符之外,!、+、-、= 等运算符都能起到立即执行的作用,这些运算符作用就是将匿名函数或函数声明转化为函数表达式。
解析器解析 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
           
立即执行函数也可以有返回值。除了可以返回 基本类型值 以外,立即执行函数也能返回任何类型的值,比如 对象,函数。

继续阅读