在阅读关于JS事件循环的内容时,我很好奇web api的执行情况。例如,在这个image中,粉红色的框没有名称(只是说“特定于实现”),让我想知道这些web api的执行位置。调用堆栈,事件循环,消息队列都有名称。我也见过关于事件循环的Philip Roberts talk,他只是将它称为“Web API”。
因此,当在调用堆栈中到达web api时,它会在调用堆栈的其余部分运行时关闭并执行。但是这个web api调用会在哪里执行?例如,如果设定的时间超过5秒,那么它在5秒钟内的位置是什么时候?
当有人单击该链接时,该“更改颜色”事件将添加到消息队列中。
如果消息队列为空,则将在下一个时钟执行。如果队列中已有其他事件,那么将在执行“changeColor”之前执行这些事件。
尽管这是2年前的问题,但由于还没有答案,我将根据我的理解尝试回答这个问题。这是我目前对javascript的理解,因为我刚刚开始编码半年,所以它可能并不准确。如果有错误,请指出。
这个问题的简单答案是:它仍在您的计算机上运行,但它与执行堆栈不在同一个线程中。
首先,我想谈谈v8引擎。 V8是javascript引擎之一,javascript引擎主要由浏览器供应商提供。第一个javascript引擎是由发明javascript的同一个人创建的。另外,在视频中,他提到setTimeout
没有在v8中实现,V8正是用于理解javascript的chrome。因此,我会说Javascript只是一堆字母,但只有javascript引擎,如V8:它理解javascript的思考方式。 [旁注:node.js
是基于V8引擎实现的,我将根据node.js
解释你的问题。]
其次,应澄清api
这个词。我不喜欢谈论定义,所以我将陈述自己的理解:api
只是一个让程序员更容易使用的界面。它隐藏了用户[使用api的开发人员]的困难作品。当我们谈论web-api
时,它可以是任何客户端api,例如youtube api,当然,对于服务器端,也有宁静的api。如果你去看看node.js
github,你会看到setTimeout
是用qavascript语言在lib/times.js中实现的。总而言之,他在视频中谈论的web-api
只是一个用javascript创建的界面。
第三,声明javascript is single-threaded
不是100%真实。 Javascript在后台运行多个线程。当然,如果你看一下事件循环图,并想一想队列和事件循环是如何工作的,你可能会注意到单个线程是不可能的。只有多个线程,javascript才能异步运行。
结论:V8没有实现setTimeout
,DOM
,所以我猜引擎本身不了解setTimeout
。虽然,setTimeout
,DOM
等是在javascript之外实现的。然后,当你在javascript中调用setTimeout
时,它不是由引擎直接编译,而是调用另一个用javascript编写的函数。并且该函数的主体可以由另一个线程中的引擎编译。
Q1:
web api调用将在何处执行?
A1:
Web-api只是被称为Javascript函数或youtube api等
Q2:
它在哪里坐5秒钟?
AA:
你的电脑,但不同的线程。