【问题标题】:Basic Javascript: Functions that Return Functions基本 Javascript:返回函数的函数
【发布时间】:2013-11-18 10:38:24
【问题描述】:

这是一个非常基本的 javascript 问题:

定义函数后:

function a(){
    alert("A!");
    return function(){
        alert("B!")
    };
}

如果我调用函数:

a();

只有“A!”警觉; 但如果我重新创建一个新功能:

var newFunc = a();
newFunc();

两个“A!”和“B!”收到警报。

有人能解释为什么吗? 百万泰铢!!

这是从 p78、面向对象的 JavaScript、Stoyan Stefanov、PACKT PUBLISHING 中提取的

【问题讨论】:

  • 哪部分不明白?调用 a() 会创建一个函数,但不会调用它。然后您可以调用 a() 创建的函数,但仅调用 a() 不会这样做。

标签: javascript


【解决方案1】:

调用以下命令将执行两个警报:

a()();

http://jsfiddle.net/pKLNW/


您的函数a 正在执行,并返回一个函数。但是你没有执行那个返回的函数。

在您的第二个示例中,这正是您正在做的事情,但分布在两行中(因此您的代码中有两个 ())。

【讨论】:

    【解决方案2】:

    很简单:

    function a()
    {
        alert("A!");
        return function()
        {
            alert("B!");
        };
    }
    a();
    

    在这种情况下,您调用a,它的函数体警告A!,然后返回一个函数。返回值(通知 B 的函数)被简单地忽略。

    当你写作时

    var newF = a();
    newF();
    

    返回的函数被赋值给newF,如果你调用那个函数,那么,通过这个变量,你可以提醒B。要一次性完成,你可以很容易地写:

    (a())();
    

    【讨论】:

    • 请问a() 周围的括号是什么意思?是a()的返回还是a()的函数的返回?
    • @user2988464:它们是可选的,但它们是为了清晰起见。这些括号用作分组运算符。它告诉 JS 首先 评估 a() 函数调用,它评估该函数的返回值...然后调用返回值为 function(){alert('B!');}...(a())()) == (function(){alert('B!');})(); == alert('B')
    【解决方案3】:

    返回值就是一个 return 值。它没有被执行。

    试试这个好玩:

    a = a();
    a();
    

    【讨论】:

      【解决方案4】:

      在第一次调用a();您正在调用该函数,它返回另一个函数。但你不叫它。
      在第二个示例中,您调用函数并将返回值(它返回的函数)存储在一个变量中,然后调用它,这将调用返回的函数。

      function a() {
        alert("A!"); //This will be called when the function a is called.
        //After the alert another function is returned:
        return function(){
          //and if this function is called, it will:
          alert("B!");
        }
      }
      
      a(); //Calls a, but do nothing with return value.  
      
      a()(); //Calls a and directly calls the return value after.  
      
      var b = a(); //Calls a and stores return value in variable 'b'
      b(); //calls 'b', which is the return value of 'a'.
      

      【讨论】:

        【解决方案5】:

        应该很明显。

        函数的返回值不是执行,而是返回。 return 语句之前的任何内容当然都会被执行。

        所以本质上,代码:var newFunc = a(); 将函数a()(在本例中为匿名函数)的返回值分配给newFunc。因此,调用newFunc() 将执行返回的匿名函数。

        您可以使用var newFunc = a()(); 强制返回的函数在分配时运行,这会将匿名函数的返回值分配给newFunc(在本例中为null,并运行警报)。

        【讨论】:

          【解决方案6】:

          您的第一个示例a() 执行a 函数,该函数执行警报函数并返回函数b(但不执行它)。

          第二个示例var newFunc = a() 执行a,并将其值保存到变量newFunc,这意味着它现在等于b。然后你执行 newFunc,它会提示 'B!'。

          【讨论】:

            【解决方案7】:

            当被调用时,a 做了两件事:

            1. 警报“A!”
            2. 创建一个功能,提醒“B!”当被调用并返回该函数时。

            您的第一个示例,a() 是对 a 的调用,因此它会提示“A!”,并创建一个提示“B!”的函数调用时返回该函数并将其丢弃(因为未使用返回值)。

            您的第二个示例 var newFunc = a() 与第一个示例类似:它是对 a 的调用,警报“A!”,创建一个(另一个)函数来警报“B!”,返回函数并返回值分配给newFunc。现在newFunc 是对提醒“B!”的函数的引用。

            最后一行代码newFunc(); 调用了提示“B!”的函数。

            【讨论】:

              【解决方案8】:

              当你这样做时:

              var newFunc = a();
              

              函数执行,所以“A!”警报,并将返回值分配给变量 newFunc:

              newfunc = function(){ alert("B!"); }

              所以当你执行 newfunc 时,"B!"警告。

              参考: Functions that return a function - Javascript

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-22
                • 2013-10-23
                • 1970-01-01
                • 2012-09-16
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多