javascript引擎,它运行在宿主环境中,对前端来说,一般是web浏览器,
代码运行到浏览器。
专业术语:
事件循环:浏览器提供了一种机制来处理程序中多个块的执行,且执行每块时调用javascript引擎,这种机制被称为事件循环
特点:
1.它的运行是单线程
2.完整运行,一个好了再下一次
以下伪代码了解一下概念,(摘自《你不知道的javascript》中),根据我的理解,再加了一些说明。
// eventLoop是一个用作队列的数组
// 先进, 先出 这但很重要,就是单线程的意思
var eventLoop = []; // 假设数组里有很多事件在排队运行了
var event;
// “永远” 执行
while(true) {
// 一次tick
if(eventLoop.length > 0) {
// 拿到队列中的下一个事件
event = eventLoop.shift();
// 现在, 执行下一个事件
try {
event()
}catch (err) {
// 报错,进行下一步处理
}
}
}
说明:
对每个tick而言,如果在队列中有等待事件,那么就会从队列中摘下一个事件并执行。定要清楚,setTimeout(…)并没有把你的回调函数挂在事件循环队列中。它所做的是设定一个定时器。当定时器到时后,环境会把你的回调函数放在事件循环中,这样,在未来某个时刻的tick会摘下并执行这个回调。
比如你的setTimeout,是1000毫秒后执行,也就是1秒,但是现在队列里面有有20个项目了, setTimeout函数一秒已经到了,但是得排在20个项目后面再执行,为了理解如果20项目要执行要2分钟,那setTimeout函数就是2分钟1秒执行。
所以setTimeout定时器的精度可能不高,你理解了吗