我一直看到这样的代码:
(function(){
//code here
})();
此代码如何工作?哪个函数接收哪些参数?
(function(factory){
//code here
}(function($){
//other code here
}));
答案 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)
让我们剖析:
另一种看待这种情况的方法是:
从函数中指定的匿名函数声明开始,第一个要传递的参数,变量名称“factory”,
然后立即调用匿名函数,到目前为止一直很好,通常称为IIFE(或者在这种情况下,D.C。称之为“狗球”;))。
这是一个扭曲,在最外层函数的立即调用中,另一个匿名函数被声明并作为参数传递。当然,这在最外面的功能中被称为“工厂”。和,
这个最内部的匿名函数具有命名参数“$”。所以我必须预测最外面的函数,当调用“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/