使用谎言 setTimeout 或者 setInterval 拍摄流动?

我读了这篇文章
http://ejohn.org/blog/how-javascript-timers-work/
如何
setTimeout


setInterval

和其他异步任务,如按下按钮,让我感到困惑。

我知道 JS 是一个线程的,即 AFAIK, 所有回调功能 /事件处理程序 a.k.a. event/ 将按顺序排队和制作。 但是,查看下面的图像,我从上面的文章中取出:


每个街区都是一些工作,而且 - 粗略 10 小姐。 - 定时器工作。 我知道它的回调函数在队列中进行后续执行,但是如何在已经执行某些东西时导致事件发生的情况?

这是因为
setTimeout//

开始使用单独的流进行内部计数时间并运行事件结束?

请注意,我不会在这里发言,以执行回调; 相反,我正试图了解如何
setTimeout

可以阅读时间并开始完成。 我知道他的回调不会被称为未以前指定的时间参数,但可能稍后,但这是因为它的回调在执行环境中找到一些时间来检查是否以行中执行某些东西。

类似于此问题,为什么浏览器接受新的点击注册,而且 - 假设循环在点击用户时落后于场景?

如果您说浏览器支持不同的东西的不同流,我们可以打电话 JS 在浏览器中单线程?
已邀请:

石油百科

赞同来自:

JavaScript 是一个螺纹的,这意味着两个部分 JavaScript 不会同时进行 /如果没有使用
https://developer.mozilla.org/ ... usage
, 但每个工人也是单线的/. 但Javascript不是唯一发挥作用的唯一作用 API 环境。 这些功能 , 作为
setTimeout

,
setInterval


addEventListener

, 实施重要 /或至少在一个线程外 JavaScript/, 他们的回调由诸如浏览器的媒体发起。 它是将这些回调在队列中的环境,它应该由单线程引擎执行 JavaScript. 这就是浏览器如何拍摄新的单击事件以启动,即使它仍然执行其他代码 JavaScript. 完全是因为这个原因 JavaScript 它被认为是一个事件。

江南孤鹜

赞同来自:

目前 /Ecmascript 6/ 您永远不会担心在功能内部更改状态。

然而,许多事情在背景中采取行动,并且它们改变自己的孤立介质,后来可能以数据碎片的形式发送到主环境。 反向呼叫队列 XMLHttpRequest, 定时器和Web工作者完成这一切。 他们都有可能同时工作 /在几个 CPUs/, 但它们都以一致的方式与主要媒体互动。

八刀丁二

赞同来自:

无需有其他流来解释这种行为。 当定时器录制添加到队列时,它刚刚在那里。 如果事件周期再次接收控件,则它只是检查是否存在已过期的计划任务。

此外,不需要额外的流来节省全球时间,因为它已经交付 OS 或实施媒介。

例如,采取这个简单的脚本 PhantomJS:


function longRunningTask// {
for/var i = 0; i < 100000; i++/ {
var s = "",
s2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
for/var j = 0; j < 1000; j++/ {
s += s2;
}
}
}

var start = new Date//.getTime//;
console.log/"begin"/;
setTimeout/function//{
console.log/"end timer 1s " + /new Date//.getTime// - start//;
}, 1000/;

setTimeout/function//{
console.log/"end timer 10s " + /new Date//.getTime// - start//;
}, 10000/;
longRunningTask//;
console.log/"end longRunningTask " + /new Date//.getTime// - start//;

setTimeout/function//{
console.log/"EXIT"/;
phantom.exit//;
}, 11000/;


导致以下结果是什么:

begin
end longRunningTask 5025
end timer 1s 5029
end timer 10s 10001
EXIT
仅当控制返回到事件周期时才会触发第二个定时器。

要回复问题请先登录注册