用到Browser Process里面 JS Thread、时间触发线程、定时触发器线程
JS分为 同步任务 和 异步任务
同步任务在主线程上执行,形成一个执行栈
。
主线程外,事件触发线程管理着一个任务队列
,当异步任务有了结果,就在任务队列
中添加一个事件。
栈中的代码调用某些API,会在事件队列中添加各种事件。因此一个函数的回调中不要无条件回调自己(回调噩梦)
当JS引擎空闲(执行栈同步任务全部执行完毕),系统读取任务队列中的事件,将其添加到执行栈
中,开始执行。
以上的机制也导致了setTimeOut不能准确的执行(主线程的执行栈还没清空)
setTimeosetTimeOut(function () {
console.log("Hello");
}, 0);
console.log("Begin");
>>>>> Begin
>>>>> Hello
虽然时间间隔不准确,但setTimeout 模拟 setInterval 比直接使用 setInterval 更加稳定,可以避免setInterval产生的累计效应。在某些情况下,使用requestAnimationFrame
function timer = () => {
// do something
setTimeout(timer, 1000);
if(...condition) { // stop auto
timer = null;
}
}
timer(); // start
timer = null; // stop manual