以下代码是如何工作的?函数如何从编译器尚未到达的表达式中调用函数?在到达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(...)
"。这不是真的。def
是IIFE
的一个参数,因此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
函数的参数列表中。
编辑:穆格重新格式化的答案当然也有助于澄清这一点!