如果我编写这段代码:
var foo = function (){
var x = 5;
return (function (){ return x;})();
}
alert(foo());
它按预期发出警报5。但是,如果我不使用IIFE:
var foo = function (){
var x = 5;
return function (){ return x;};
}
alert(foo());
它提醒
function(){return x;}
我知道在第一个示例中IIFE会运行,并且它计算的任何内容都会返回。但是,如果不使用IIFE函数,则会返回而不执行。 为什么函数在执行之前返回?
答案 0 :(得分:4)
JS中的函数是一流的对象。您可以像对待任何对象一样对待它们,包括在函数之间传递它们。
如果您不执行任何操作来调用函数,则不会调用该函数。
function(){return x:}也是如此,在第二个选项中,它会收到字符串警报
它是一个函数。
函数像任何对象一样,具有toString
方法。
alert()
需要传递一个字符串。由于您将对象传递给它,因此它将被转换为字符串,这可以通过调用toString()
完成。
答案 1 :(得分:1)
基本上,在第二个示例中,在返回任何内容之前,您不会执行该函数。您将在以下行返回函数定义:return function (){ return x;};
。这就是为什么该函数仅返回放置在return
之后的函数的原因。
答案 2 :(得分:1)
永远不会自动调用函数。它们可以作为参数传递,作为值返回,分配给变量等,而这只是在对该函数的引用周围移动。为了调用函数,您必须使用()
运算符。
您的第一个示例通过调用IIFE中的函数来完成此操作。 “ II”代表“立即调用”,是指将()
放在匿名函数表达式之后,以便您对其进行定义然后立即调用它。
在第二个示例中,您仅返回函数,然后将其作为参数传递给alert()
。 alert()
没有理由调用该函数(与map()
或forEach()
不同,后者带有一个回调参数并被指定来调用该函数)。如果要执行该函数,则需要显式调用它,例如
var foo = function() {
var x = 5;
return function() {
return x;
};
}
alert(foo()());
双精度()
的意思是先调用foo
,然后调用返回的任何内容,最后将结果传递给alert
。