Javascript事件循环:web api';谁会被处死?

Javascript事件循环:web api';谁会被处死?,javascript,event-loop,Javascript,Event Loop,在阅读有关JS事件循环的文章时,我很好奇web api在哪里执行。例如,在本例中,粉色框没有名称(只是说“特定于实现”),这让我想知道这些web api是在哪里执行的。调用堆栈、事件循环、消息队列都有名称。我也看过Philip Roberts关于事件循环的介绍,他只是把它称为“Web API” 因此,当在调用堆栈中访问web api时,它将关闭并执行,而调用堆栈的其余部分将运行。但是web api调用将在哪里执行呢?例如,如果设置的时间为5秒,那么这5秒的时间在哪里?当有人单击链接时,“chan

在阅读有关JS事件循环的文章时,我很好奇web api在哪里执行。例如,在本例中,粉色框没有名称(只是说“特定于实现”),这让我想知道这些web api是在哪里执行的。调用堆栈、事件循环、消息队列都有名称。我也看过Philip Roberts关于事件循环的介绍,他只是把它称为“Web API”


因此,当在调用堆栈中访问web api时,它将关闭并执行,而调用堆栈的其余部分将运行。但是web api调用将在哪里执行呢?例如,如果设置的时间为5秒,那么这5秒的时间在哪里?

当有人单击链接时,“changeColor”事件将添加到消息队列中


如果消息队列为空,它将在下一次勾选时执行。如果队列中已经存在其他事件,那么将在执行“changeColor”之前首先执行这些事件

尽管这是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的开发人员]隐藏了困难的工作。当我们谈论
webapi
时,它可以是任何客户端api,当然,对于服务器端来说,也有restfulapi。如果您去查看
node.js
github,您将看到
setTimeout
是用javascript语言实现的。总之,他在视频中谈到的
webapi
只是一个用javascript创建的界面

第三,语句
javascript是单线程的
不是100%正确的。Javascript在后台运行多个线程。当然,如果您查看事件循环图,并思考队列和事件循环是如何工作的,您可能会注意到单线程是不可能的。只有使用多个线程,javascript才能异步运行

结论:V8没有实现
setTimeout
DOM
,所以我猜引擎本机不理解
setTimeout
。而,
setTimeout
DOM
等都是在javascript之外实现的。 然后,当您在javascript中调用
setTimeout
时,它不是由引擎直接编译的,而是调用另一个用javascript编写的函数。该函数的主体可以由引擎在另一个线程中编译

问题1:

web api调用将在哪里执行

A1:

Web api只是像Javascript函数或youtube api一样被调用

问题2:

在哪坐5秒钟

A2:

你的电脑,但一个不同的线程


我不确定你所说的“WebAPI”是什么意思,但它确实是这样的:一些本机代码做它应该做的事情。在链接图像的示例中,它是浏览器的DOM渲染引擎。在setTimeout调用的情况下,它只是内存中某个地方的超时队列,由本机代码以特定于实现的方式进行管理。@Bergi好的,假设调用堆栈中的下一项是
setTimeout
,时间为5秒。调用堆栈不会等待5秒,然后继续处理堆栈的其余部分
setTimeOut
将关闭并在其他地方执行,而调用堆栈的其余部分将继续。但是,从我试图研究的内容来看,
setTimeout
在哪里以及如何执行并不清楚。实际上,它不会关闭并在其他地方执行,它只是将回调放入计时器队列中,然后返回。但是是的,它可以在后台线程中继续运行并在那里等待5秒钟,也可以以任何其他方式实现。没关系。这是引擎/浏览器的工作。重要的是,在五秒钟后,回调被放入要执行的消息队列中。是的,从我链接的图像可以明显看出这一点。请参阅我对Bergi评论的回复,以澄清Caiton。上面Bergi是正确的。在上述场景中,setTimeout内的回调函数将在5秒后添加到事件队列中。