编译器/解释器如何知道函数是异步的?

时间:2013-12-22 05:28:49

标签: javascript asynchronous asynccallback

我是JavaScript新手,当我在“ JavaScript the good parts ”一书中读到它时,我对异步函数有疑问:

我了解以下代码将同步执行并可能导致延迟:

request = prepare_the_request();
response = send_request_synchronously(request);
display(response);

但是,以下代码被称为异步执行:

request = prepare_the_request();
send_request_asynchronously(request, function(response){
    display(response);
});

编译器(或解释器?我不确定如何解释JavaScript)知道第二个代码块是否应该异步执行?

提前谢谢。

(如果问题不明确请发表评论,我很抱歉没有明确表达。)

2 个答案:

答案 0 :(得分:1)

Compiler / Interpreter不知道,实际上并不关心它。在多进程操作系统上,两个或多个线程可以并发运行,Javascript的XMLHTTPRequest对象允许在单独的线程中运行请求。这样,Javscript启动线程,但由于它在一个单独的线程中运行,它不会等待并继续下一个命令。

答案 1 :(得分:1)

我完全诚实......我第一次阅读 Javascript,好的部分第53页上的 Callbacks 部分,我也做了和哈哈哈一样的假设,虽然后来我才发现作者的意思。

您之前的陈述实际上并不正确:

  

但是,以下代码被称为异步执行:

在作者使用回调函数显示代码之前,他说以下段落:

  

更好的方法是发出异步请求,提供一个   当服务器响应时将调用的回调函数   接收。异步函数立即返回,因此客户端   没有被阻止:

这里的重要部分是: ...发出异步请求,提供回调函数......

作者试图说明你可以制作如下函数:

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

然后当解释器正在读取代码的那一部分时,函数会立即执行,从而迫使系统 S ynchronous,其中不包括() ,通过实现具有异步功能的代码然后调用此函数,为将来 A 同步打开了大门。

作为最后一个重点,让我们记住这就是使回调函数成为回调函数的原因。在函数中包含函数时,不会调用它。例如,如果我创建一个称为称呼的函数:

var salutations = function (hello(){alert('hi')})
{
   alert ('salutations!');
}

如果我在上一段代码之后没有更多代码,你将永远不会看到一个警告弹出窗口。只有在声明/启动后调用/调用时才会调用它(HENCE术语:&#34;它被回调&#34;在创建AKA回调之后)。但是,如果我在回调函数之后包含一个尾随(),那么它将导致函数在声明和启动函数salutations期间实际执行。