为什么函数返回未执行的

时间:2018-10-04 15:26:26

标签: javascript

如果我编写这段代码:

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函数,则会返回而不执行。 为什么函数在执行之前返回?

3 个答案:

答案 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