setTimeout()是如何实现的,这样它就可以在不阻塞主线程的情况下跟踪经过的时间

How is setTimeout() implemented such that it can keep track of the time elapsed without blocking the main thread?

本文关键字:情况下 时间 经过 跟踪 线程 何实现 实现 setTimeout 就可以      更新时间:2024-03-07

给定的setTimeout调用

setTimeout(function() {
  console.log('hello')
}, 1000)

您知道您的代码将在>=1000ms内运行。

但是,如果JavaScript是单线程的,那么setTimeout调用如何以非阻塞的方式跟踪所用的时间?

我知道事件循环的基本原理,并且知道在x时间之后,回调被传递到回调队列;然而,我不明白的是setTimeout如何能够在后台跟踪时间而不降低执行线程的速度。

即使它是并发(而不是并行)运行的,并且使用了某种调度程序,它不会影响同步运行的其余代码的性能吗?

setTimeout由node.js实现,并不是javascript的实际组成部分。这让它可以稍微违反规则。javascript无法在不阻塞主线程的情况下延迟代码的执行,因此包装JS引擎的环境实现了setTimeout来为我们提供该功能。