Javascript语法:立即调用带参数的函数表达式(IIFE)

时间:2014-06-19 15:53:50

标签: javascript iife

我一直看到这样的代码:

(function(){
   //code here
})();

此代码如何工作?哪个函数接收哪些参数?

(function(factory){
   //code here
}(function($){
  //other code here
}));

2 个答案:

答案 0 :(得分:4)

function($){
  //other code here
}

该块作为参数传递给外部IIFE。写这样可能更清楚:

var factoryDef = function($) { ... };

(function(factory) {
    // this is the outer IIFE
    var someVar = {};
    // you can call:
    factory(someVar);
    // the previous line calls factoryDef with param someVar
}(factoryDef));

因此factory(someVar)factoryDef({})相同;后者只是factory(函数factoryDef)的值,其值为someVar{}。)

这有意义吗?

答案 1 :(得分:1)

让我们剖析:

另一种看待这种情况的方法是:

  1. 从函数中指定的匿名函数声明开始,第一个要传递的参数,变量名称“factory”,

  2. 然后立即调用匿名函数,到目前为止一直很好,通常称为IIFE(或者在这种情况下,D.C。称之为“狗球”;))。

  3. 这是一个扭曲,在最外层函数的立即调用中,另一个匿名函数被声明并作为参数传递。当然,这在最外面的功能中被称为“工厂”。和,

  4. 这个最内部的匿名函数具有命名参数“$”。所以我必须预测最外面的函数,当调用“factory”时,最里面的函数会传递给它的东西,在最里面的函数中它将被称为“$”。例如:factory(jQuery);

  5. 实际上,在阅读代码时,我认为最好从最后和内部开始。所以这里我首先看到的是带有“$”的函数。看起来像一个匿名函数声明。它碰巧在函数执行中实例化。搬出去,现在离开。立即执行的函数也是一个匿名函数,不是问题,因为它只被调用一次并且它的执行是由它构建的。而我们最内部的匿名函数在最外层的函数声明中得到了一个名字。最后将整个交易包含在括号中是必要的,以便将匿名函数放在表达式上下文中。如果该行的第一件事是单词“function”,则该函数处于声明上下文中,并且Javascript解析器将不允许立即调用它。糟糕。

    更加突出的看起来像:

    var innerMost = function($) { console.log($); };
    var outerMost = function(factory) {
        var kaChing = 'baLing';
        factory(kaChing);
    };
    
    outerMost(innerMost);
    

    瞧!

    摆弄这个:http://jsfiddle.net/xFnP7/1/

    此处更多:http://benalman.com/news/2010/11/immediately-invoked-function-expression/