js是单线程机制。异步操作,如ajax请求、setTimeout/setInterval、js事件等,会等到同步程序执行之后,将异步操作放入任务队列中。
今天我们来看setTimeout/setInterval。
setTimeout的等待时间结束后,并不是直接执行的,而是推入浏览器的一个任务队列中,在同步队列结束后,再一次调用任务队列中的任务。(setInterval则是每隔一段时间,就把任务放在任务队列中,举一反三哦)
举个栗子:
var a = 1;
function test () {
setTimeout(function () {
a = 5;
console.log( a );
}, 0);
console.log( a );
}
test();
console.log( 0 )
//结果:1,0,5
setTimeout延迟时间是0s,意味着,立马把任务放进任务队列中,在主线程完全执行完毕之后,按异步任务队列中的顺序执行。所以会在同步任务队列执行完毕之后才执行setTimeout的函数。
再来看一个栗子: