以下代码如何运作?函数如何从编译器尚未达到的表达式调用函数?达到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
});
答案 0 :(得分:0)
“def(window) is reached before (function def(...)
”
。这不是真的。 def
是IIFE
的参数,因此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);
答案 1 :(得分:0)
这段代码比我编码的代码更冗长。即,IIFE
函数即使以匿名方式执行也会被命名。 def
函数也是如此 - 即使它有一个名字,它也是匿名使用的。
无论如何,要回答你的问题:创建IIFE
函数就像在Javascript中的任何其他函数一样。但随后它会立即执行一个参数,这在Javascript中完全有效。该参数是另一个功能。与任何其他语言一样,该参数在函数调用站点进行评估。但是,JavaScript也将函数视为数据。在此示例中,函数def
在调用站点定义,然后输入IIFE
函数的参数列表。
编辑:Moog's reformatted answer当然也有助于澄清它!