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

Javascript setTimeout()是如何实现的,这样它就可以在不阻塞主线程的情况下跟踪经过的时间?,javascript,node.js,multithreading,Javascript,Node.js,Multithreading,给定的setTimeout调用 setTimeout(function() { console.log('hello') }, 1000) 您知道您的代码将以>=1000毫秒的速度运行 但是,如果JavaScript是单线程的,setTimeout调用如何以非阻塞方式跟踪经过的时间 我知道事件循环的基本原理,并且理解在x时间之后回调被传递到回调队列;然而,我不明白的是setTimeout如何能够在后台跟踪时间,而不会减慢执行线程 即使它是并发运行的(不是并行运行的),并且使用了某种调度程序

给定的
setTimeout
调用

setTimeout(function() {
  console.log('hello')
}, 1000)
您知道您的代码将以>=1000毫秒的速度运行

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

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


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

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

@RayonDabre这没有帮助。我已经读过这篇文章,但它没有解释setTimeout在幕后是如何工作的。如何实现非阻塞计时器?它是由node.js实现的,而不是js引擎本身。虽然是
非阻塞
,但它仍保留在
队列中
。抱歉,我的措辞不正确。基本上,setTimeout不是javascript的一部分,而是由实现它的任何东西添加到javascript中的东西。例如,所有web浏览器都会添加它,node.js也会添加它。它们的实现方式也不完全相同。例如,在node.js中,setTimeout返回一个
Timer
的实例,在浏览器中,它返回一个标识符。这就是我所想的,但似乎在任何地方都没有记录。非常感谢。不知道你为什么被否决…似乎有人不喜欢这个问题:p