通用模块定义IIFE模式

时间:2014-09-02 15:29:34

标签: javascript

以下代码如何运作?函数如何从编译器尚未达到的表达式调用函数?达到def(window)之前已达到(function def(...)。在考虑这个问题我在哪里错了?谢谢。

var a = 2;

(function IIFE( def ){
def( window );
})(function def( global ){
var a = 3;
console.log( a ); // 3
console.log( global.a ); // 2
});

2 个答案:

答案 0 :(得分:0)

def(window) is reached before (function def(...)” 。这不是真的。 defIIFE的参数,因此def以窗口作为参数执行,您可以获得正确的结果。在JavaScript中没什么不寻常的。

如果您将功能分开,这会有所帮助:

var a = 2;

function def(global) {
  var a = 3;
  console.log(a); // 3
  console.log(global.a); // 2
};

function IIFE(def){
    def(window);
}

IIFE(def);

<强> http://jsbin.com/jomep/1/edit

答案 1 :(得分:0)

这段代码比我编码的代码更冗长。即,IIFE函数即使以匿名方式执行也会被命名。 def函数也是如此 - 即使它有一个名字,它也是匿名使用的。

无论如何,要回答你的问题:创建IIFE函数就像在Javascript中的任何其他函数一样。但随后它会立即执行一个参数,这在Javascript中完全有效。该参数是另一个功能。与任何其他语言一样,该参数在函数调用站点进行评估。但是,JavaScript也将函数视为数据。在此示例中,函数def在调用站点定义,然后输入IIFE函数的参数列表。

编辑:Moog's reformatted answer当然也有助于澄清它!