Javascript 为什么函数返回未执行

Javascript 为什么函数返回未执行,javascript,Javascript,如果我写这段代码: var foo = function (){ var x = 5; return (function (){ return x;})(); } alert(foo()); 它会按预期向5发出警报。但是,如果我不使用生命: var foo = function (){ var x = 5; return function (){ return x;}; } alert(foo()); 它提醒 function(){return x;}

如果我写这段代码:

var foo = function (){
    var x = 5;  
    return (function (){ return x;})();
}
alert(foo());
它会按预期向5发出警报。但是,如果我不使用生命:

var foo = function (){
    var x = 5;  
    return function (){ return x;};
}
alert(foo());
它提醒

function(){return x;}
我知道在第一个例子中,IIFE运行并返回它计算的任何内容。但是,如果不使用IIFE函数,则返回而不执行。
为什么函数在执行之前返回?

在第二个示例中,基本上,在返回任何内容之前,您不会执行函数。您正在返回一个函数定义,其中包含此行:
returnfunction(){returnx;}。这就是为什么函数只返回您放置在JS中的
返回

函数之后的函数是第一类对象。您可以像对待任何对象一样对待它们,包括在函数之间传递它们

如果你不做一些事情来调用一个函数,那么它就不会被调用

在第二个选项中收到警报的函数(){return x:}也是字符串吗

这是一个函数

函数与任何对象一样,都有一个
toString
方法


alert()
希望传递一个字符串。因为您向它传递了一个对象,所以它将被转换为字符串,这是通过调用
toString()

函数来完成的。函数永远不会被自动调用。它们可以作为参数传递、作为值返回、分配给变量等等,这只是围绕函数的引用移动。要调用函数,必须使用
()
运算符

您的第一个示例通过调用IIFE中的函数来实现这一点。“II”代表“立即调用”,是指将
()
放在匿名函数表达式后面,以便您定义它,然后立即调用它

在第二个示例中,只需返回函数,然后将其作为参数传递给
alert()
alert()
没有理由调用该函数(它不像
map()
forEach()
,它们接受回调参数并指定调用该函数)。如果要执行该函数,需要显式调用它,例如

var foo=function(){
var x=5;
返回函数(){
返回x;
};
}

警报(foo())()
所做的。您想做什么?嗯……您显式地
返回函数…
;返回一个函数。你没打电话。不清楚惊喜在哪里。好的,另一个:IsDid你的意思是做
foo()()
?因此,如果传递一个对象以发出警报,它会自动将其转换为字符串,使用toString()?@Yozex,这正是答案的最后一行所说的。