setInterval()如何独立于顺序执行而运行?

问题描述 投票:-1回答:2

我是软件开发的初学者。就我所知,JavaScript从左到右,从上到下依次运行,仅在调用函数时跳过行并返回回车符。如果是这样的话,当程序当前被其他计算占用时,该程序如何记住运行setInterval函数集以每2000ms执行一次?

javascript html css
2个回答
2
投票

在幕后,有一个JavaScript应该运行的“任务”队列(事件循环)。任务就是功能。在函数的结尾,JavaScript检查队列以查看是否应调用另一个函数。

setInterval仅将函数推入此队列,以在指定的时间运行。

JavaScript仅具有1个线程,因此,如果繁重的计算占用大量时间,则队列中的事件将推迟到该任务完成为止。

这就是为什么您不想在JS中运行阻止功能的原因。


-1
投票

尽管每个JavaScript代理都有一个执行线程-所谓的事件循环-运行时不受用于为其提供服务的执行线程数的限制。

传递给setIntervalsetTimeoutrequestAnimationFrame之类的函数的回调被安排为由JavaScript运行时环境中的“魔术”(即隐藏逻辑)运行。

此隐藏逻辑计划在适当的时间(例如,在间隔过去之后)在job queue上插入回调。当回调到达相关作业队列的最前面时,并且当JavaScript运行时逻辑请求该回调时,该作业将从队列中删除,为其实例化堆栈帧(execution context),然后开始执行。

setTimeoutsetIntervalrequestAnimationFrame之类的异步功能由主机应用程序(例如,Web浏览器或NodeJS)提供,并且不属于JavaScript规范的一部分。

另一方面,在ECMAScript规范中指定了异步promise behavior

© www.soinside.com 2019 - 2024. All rights reserved.