通用模块定义IIFE模式



以下代码是如何工作的?函数如何从编译器尚未到达的表达式中调用函数?在到达CCD_ 2之前到达def(window)。我这样想哪里不对?非常感谢。

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

"def(window) is reached before (function def(...)"。这不是真的。defIIFE的一个参数,因此def以window作为参数来执行,您可以得到正确的结果。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

这段代码比我编写的要详细一些。也就是说,即使IIFE函数是以匿名方式执行的,它也会被命名。def函数也是如此——它是匿名使用的,即使它有一个名称。

无论如何,为了回答您的问题:IIFE函数的创建与Javascript中的任何其他函数一样。但是,它会立即用一个参数执行,这个参数在Javascript中是完全有效的。参数是另一个函数。就像任何其他语言一样,参数是在函数调用位置计算的。然而,JavaScript也将函数视为数据。在本例中,函数def在调用站点定义,然后输入到IIFE函数的参数列表中。

编辑:穆格重新格式化的答案当然也有助于澄清这一点!

最新更新