【问题标题】:Callback() Node JsCallback() 节点 Js
【发布时间】:2015-09-06 03:18:20
【问题描述】:

我对这个程序很困惑。我买了一本 Brad Dayley 写的名为“Node JS, MongoDB, and AngularJS Web Development”的书。我找到了一个程序来演示一个叫做闭包的东西,它以这个程序为例。这只是程序的第一部分。

function logCar(logMsg, callback){
    process.nextTick(function(){
        callback(logMsg);
    });
}

var cars = ["Ferrari", "Porsche", "Bugatti"];

for(var idx in cars){
    var message = "Saw a " + cars[idx];
    logCar(message, function(){
        console.log("Normal Callback: " + message);
    })
}

我整整一个小时都想弄清楚这个程序是如何运行的,但我无法弄清楚回调(logMsg)的功能是什么。

我知道这可能是一个非常基本的问题,但我就是想不通。

【问题讨论】:

    标签: javascript angularjs node.js mongodb


    【解决方案1】:

    callback 是您传递给 logCar() 的任何函数。当 logCar 完成它应该做的任何事情时,它会调用回调函数。在你的 for 循环中,你像这样调用 logCar() ..

    logCar(message, function(){
        console.log("Normal Callback: " + message);
    })
    

    这里,function() {..} 是回调函数,它会在 logCar 执行完毕后被调用。在这种情况下,您提供的回调函数将console.log 您作为第一个参数传递的消息。您也可以传递另一个函数,该函数也可以作为回调执行不同的操作。

    【讨论】:

    • 为什么 callback(logMsg) 会传递 logMsg 变量?匿名函数的参数中没有任何东西可以保存它。
    • 但是您已经定义了您的回调函数,以将传递的任何内容作为logCar 函数中的第一个参数。因此,您作为回调传递的任何函数都将自动获取 logMsg 变量。
    • 在 logCar 函数结束时,会发生回调(logMsg)。这调用了匿名函数。我不明白如何或为什么将变量 logMsg 传回。如果您查看匿名函数,参数中没有任何内容可以“捕获” logMsg 变量。
    • 哦,我不知道。所以澄清一下,我提供的匿名函数将自动获取 logMsg 变量,因为我将它作为回调函数传递给 logCar?
    • 你,先生,太不靠谱了。代表您,Bidhan 先生。
    【解决方案2】:

    我发现通过更紧密地遵循执行路径,尤其是 logMsg 采用的路径,这些更容易让我理解。一个好的调试器非常适合这个。

    在定义了一个名为 message 的变量的 for 循环之前,什么都没有发生。一开始会是“Saw a Ferrari”。

    “消息”旁边还有一个匿名函数,不幸的是,它很难分离和定义。因为它会在其范围之外查找被困在 for 循环中的名为“message”的变量,所以我们无法在第 6 行执行:

    var someFunction = function(){
          console.log("Normal Callback: " + message);
    }
    

    ...因为什么是“信息”?该 for 循环之外的任何内容都无法直接访问“消息”(除了闭包,但不要担心)。请注意,此功能尚未执行。它此时刚刚创建。

    所以接下来执行LogCar("Saw a Ferrari", someFunction...)。日志车在哪里?哦,顶。让我们跳到那里,但为简单起见,让我们跳过 process.nextTick。基本上someFunction("Saw a Ferrari") 发生在这里。 SomeFunction 在哪里?哦,那是尚未执行的匿名函数。现在执行的时候到了。于是进程跳回到那里查看里面有什么并执行,也就是console.log("Saw a Ferrari");

    完成了,然后重复“Saw a Porsche”的过程。

    【讨论】:

      猜你喜欢
      • 2019-03-24
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多