老实说……我第一次阅读Javascript第 53 页上的相同回调部分时,好的部分,我也做了和你一样的假设哈哈哈,虽然后来我才知道作者的意思.
您之前的陈述实际上并不正确:
但是,据说以下代码是异步执行的:
在作者展示带有回调函数的代码之前,他说了以下段落:
更好的方法是发出一个异步请求,提供一个回调函数,当接收到服务器的响应时将调用该回调函数。异步函数立即返回,因此客户端不会被阻塞:
这里的重要部分是:...发出异步请求,提供回调函数...
作者试图指出您可以创建如下函数:
send_request_asynchronously(request, function (response) {
display(response);
});
在代码通过解释器运行时不会执行function (response) {display(response);}
,而是在将来某个时间调用时执行send_request_asynchronously
,稍后在代码中您可以使其异步。代码本身没有任何异步。它被设计为稍后异步调用。
“提供回调函数”是推断作者的意思的关键。()
如果您注意到,回调函数之后没有尾随。如果你确实有这样的尾随()
:
send_request_asynchronously(request, function (response) {
display(response);
}());//<--- right here
那么当解释器正在阅读代码的那部分时,该函数将立即执行,从而强制系统同步,如果不包括,您将打开大门,使其在未来成为A同步使用异步功能实现代码,然后调用此函数。()
最后一点,让我们记住,这就是使回调函数成为回调函数的原因。当您在参数中包含函数时,它不会被调用。例如,如果我创建一个名为 salutations 的函数:
var salutations = function (hello(){alert('hi')})
{
alert ('salutations!');
}
如果在上一个代码之后我没有更多代码,您将永远不会看到警报弹出窗口。它只会在它的声明/启动之后被调用/调用时被调用(因此术语:在创建 AKA 回调之后“它正在被回调”)。但是,如果我在回调函数之后包含一个尾随()
,它将导致该函数在声明和启动 function 期间实际执行salutations
。