我对这个节目感到很困惑。我在Brad Dayley那里买了一本名为“Node JS,MongoDB和AngularJS Web开发”的书。我找到了一个程序来演示一个叫做闭包的东西,并以此程序为例。这只是该计划的第一部分。
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)。
我知道这可能是一个非常基本的问题,但我无法绕过它。
答案 0 :(得分:2)
回调是您传递给logCar()的任何函数。当logCar完成它应该做的任何事情时,它将调用回调函数。在for循环中,你可以像这样调用logCar()..
logCar(message, function(){
console.log("Normal Callback: " + message);
})
这里,function(){..}是回调函数,一旦logCar执行完就会调用它。在这种情况下,您提供的回调函数将console.log
您传递的消息作为第一个参数。你可以通过另一个函数来执行不同的回调函数。
答案 1 :(得分:2)
我发现通过更紧密地遵循执行路径,尤其是logMsg采用的路径,我们更容易解决这些问题。一个好的调试器对此非常有用。
在for循环之前没有任何事情发生,其中定义了一个名为message的变量。一开始它将是“看见法拉利”。
“消息”旁边还有一个匿名函数,遗憾的是难以分离和定义。因为它看起来超出了它的范围,因为一个名为“message”的变量被困在for循环中,我们无法在第6行进行:
var someFunction = function(){
console.log("Normal Callback: " + message);
}
...因为什么是“消息”?除了for循环外,没有任何东西可以直接访问“消息”(除了封闭,但不要担心)。请注意,此功能尚未执行。它刚刚被创建了。
接下来执行LogCar("Saw a Ferrari", someFunction...)
。 LogCar在哪里?哦,顶部。让我们跳到那里,但为了简单起见,我们跳过process.nextTick。基本上someFunction("Saw a Ferrari")
发生在这里。 SomeFunction在哪里?哦,这就是那个尚未执行的匿名函数。现在它的执行时间到了。因此,该过程会跳回那里以查看其中的内容并执行它,即console.log("Saw a Ferrari");
已经完成了,并且“Saw a Porsche”重复了这个过程。