立即执行函数(IIFE),可以看做是一个自调用的匿名函数。例如:
var a = 2; (function (){ var a = 3; console.log(a); // 3 })(); console.log(a); // 2通常我们使用的具名函数调用都是形如fn(),函数名加上一个括号执行的; 例如:
function fn(){ console.log('I am a normal function') } fn();那么类似的立即执行函数可以像 function(){}() 执行吗?答案是不行的;因为 function(){} 没有名称标识符,函数声明不可以省略函数名,这在JavaScript语法中是非法的,但是函数表达式却可以是匿名的。当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明,所以给 function(){} 加个括号变成如下形式就可以了:
(function(){ console.log('I am aonymous function'); })();上面所说的是立即执行函数的第一种形式,还有一种常见的形式是:
(function(){ console.log('I am aonymous function'); }());以上立即执行函数的两种形式都比较常见,最后介绍一种不太常见的形式,这种变化的用途是倒置代码的运行顺序,将需要的函数放在第二位,在IIFE执行之后当做参数传递进去。下面用一个例子来说明:
var a = 2; (function (def){ def(window); })(function def(global){ var a = 3; console.log(a); // 3 console.log(global.a); // 2 });函数表达式def定义在片段的第二部分,然后当做参数(这个参数也叫做def)被传递进IIFE函数定义的第一部分中。最后,参数def(也就是传递进去的函数)被调用,并将window传入当做global参数的值。