我会尽量让这个问题变得简单。 “回调”是由另一个函数调用的任何函数,该另一个函数将第一个函数作为参数。很多时候,“回调”是在以下情况下调用的函数:某物发生。那某物用程序员的话说,可以称为“事件”。
想象一下这样的场景:您将在几天内收到包裹。该包裹是送给您邻居的礼物。因此,一旦您收到包裹,您希望将其交给邻居。您出城了,因此您给您的配偶留下了指示。
您可以告诉他们去取包裹并将其带给邻居。如果你的配偶像电脑一样愚蠢,他们会坐在门口等待包裹到来(不做任何其他事情),然后一旦包裹到来,他们就会把它交给邻居。但还有更好的方法。告诉您的配偶,一旦他们收到包裹,就应该将其交给邻居。然后,他们可以正常生活,直到收到包裹。
在我们的示例中,收到包裹是“事件”,将包裹带给邻居是“回调”。您的配偶“执行”您的指示,仅将包裹送过来when包裹到达。好多了!
这种思维在日常生活中是显而易见的,但计算机却没有同样的常识。考虑程序员通常如何写入文件:
fileObject = open(file)
# now that we have WAITED for the file to open, we can write to it
fileObject.write("We are writing to the file.")
# now we can continue doing the other, totally unrelated things our program does
在这里,我们在写入之前等待文件打开。这“阻塞”了执行流程,并且我们的程序无法执行它可能需要执行的任何其他操作!如果我们可以这样做怎么办:
# we pass writeToFile (A CALLBACK FUNCTION!) to the open function
fileObject = open(file, writeToFile)
# execution continues flowing -- we don't wait for the file to be opened
# ONCE the file is opened we write to it, but while we wait WE CAN DO OTHER THINGS!
事实证明,我们使用一些语言和框架来做到这一点。它太酷了!查看Node.js http://nodejs.org/对这种思维进行一些真正的练习。