JavaScript中立即执行函数(IIFE)的不同形式

立即执行函数(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参数的值。


参考阅读

  1. 你不知道的JavaScript上卷>3.3.2 立即执行函数表达式
  2. JavaScript:立即执行函数表达式(IIFE)

你可能感兴趣的:(javascript)