声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行;
立即执行函数的创建步骤,看下图:
定义函数之后,立即调用该函数时,不能在函数的定义后面直接加圆括号,这会产生语法错误。产生语法错误的原因是,function 这个关键字,既可以当做语句,也可以当做表达式,如:
//语句 function fn() {}; //表达式 var fn = function (){};
为了避免解析上的歧义,JS引擎规定,如果function出现在行首,一律解析成语句。因此JS引擎看到行首是function关键字以后,认为这一段都是函数定义,不应该以原括号结尾,所以就报错了。
解决方法就是不要让function出现在行首,让JS引擎将其理解为一个表达式,最简单的处理就是将其放在一个圆括号里,如下边:
(function(){ //code }()) (function (){ //code })()
(function(形参){ //代码中可以使用j })(实参) // 立即执行函数的返回值 var result = (function(){ var res = 1+2; return function(){ return res; } })() console.log(result());
上边的两种写法,都是以圆括号开头,引擎会意味后面跟的是表达式,而不是一个函数定义语句,所以就避免了错误,这就叫做"立即调用的函数表达式"。
立即执行函数,还有一些其他的写法(加一些小东西,不让解析成语句就可以),比如下边:
(function () {alert("我是匿名函数")}()) //用括号把整个表达式包起来 (function () {alert("我是匿名函数")})() //用括号把函数包起来 !function () {alert("我是匿名函数")}() //求反,我们不在意值是多少,只想通过语法检查 +function () {alert("我是匿名函数")}() -function () {alert("我是匿名函数")}() ~function () {alert("我是匿名函数")}() void function () {alert("我是匿名函数")}() new function () {alert("我是匿名函数")}()
立即执行函数的作用
- 不必为函数命名,避免了污染全局变量
- 立即执行函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量
- 封装变量
总而言之:立即执行函数会形成一个单独的作用域,我们可以封装一些临时变量或者局部变量,避免污染全局变量