javascript异步(1)--事件循环、调用栈及回调队列

491 阅读1分钟

同步与异步

  • 同步即有1、2、3个事件按顺序执行,如果有的事件耗时很长就会造成堵塞。
  • 异步则是可以在一个事件执行期间去执行其他的事件。

回调函数

回调函数在定义上,是指作为参数传给另一个函数的函数。

function a(callback){
    //想要执行的语句
    console.log("主函数");
    //回调函数,必须在执行语句后面
    b();
}
function b(){
    console.log("回调函数");
}
a(b); 
//result:主函数 回调函数

调用栈与回调队列

首先,栈是后进先出,队列是先进先出。
函数在执行时,会先后压入调用栈中,执行完成后从栈中移除。而遇到异步事件,如ajax,setTimeOut,onload,onclick,会将这些事件放入到回调队列中。

事件循环

事件循环:当所有调用栈中的事件执行完成后再执行回调队列中的事件。

console.log("1");
setTimeout(function(){
    console.log(2);
},5000);
setTimeout(function(){
    console.log(3);
},0);
console.log(4);
//1,4,3,5s后输出2

首先,把console.log("1")压入调用栈,执行输出1后c移除出栈;执行到第一个setTimeout时,因为是异步事件,所以放入到回调队列中;运行到第二个setTimeout时,虽然是0s后就执行,但也是放入回调队列,然后执行console.log("4")时压入调用栈,输出4后出栈,此时调用栈空了,开始执行回调队列中的事件,输出3和2。