【问题标题】:Javascript Syntax: Immediately Invoked Function Expression (IIFE) with parametersJavascript 语法:带参数的立即调用函数表达式 (IIFE)
【发布时间】:2014-08-10 05:59:20
【问题描述】:

我总是看到这样的代码:

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

这段代码是如何工作的?哪个函数接收哪个参数?

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

【问题讨论】:

  • 什么不能得到...?在 IIFE 中,factory 是一个可以传递参数的函数,然后在回调中调用 $...

标签: javascript iife


【解决方案1】:
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({}) 相同;后者只是用someVar(即{})的值调用的factory(即函数factoryDef)的值。

这有意义吗?

【讨论】:

  • 我们可以为 IIFE 做回调吗??
【解决方案2】:

让我们剖析一下:

另一种看待这个的方式是:

  1. 以匿名函数声明开始,在函数内赋值,第一个要传递的参数,变量名“factory”,

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

  3. 这是一个转折点,在最外层函数的立即调用中,另一个匿名函数被声明并作为参数传递。这当然被称为最外层函数中的“工厂”。而且,

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

其实在阅读代码的时候,我觉得最好从末尾和内部开始。所以在这里我首先看的是带有“$”的函数。看起来像一个匿名函数声明。它恰好在函数执行中被实例化。现在搬出去就走。立即执行的函数也是一个匿名函数,这不是问题,因为它只被调用一次并且它的执行是构建它的。而我们最内层的匿名函数在最外层的函数声明中获得了一个名称。最后,将整个交易放在括号中是必要的,以便将匿名函数放在表达式上下文中。如果该行的第一件事是单词“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/

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 2023-04-04
    • 2012-12-28
    • 2012-09-02
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多