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