当一个方法执行时内部调用另外的方法,则会造成调用栈,如图:javascript
JavaScript有一个主线程执行当前任务,主线程的代码同步执行,并把遇到的事件和回调注册到事件表中。
当事件表中的事件被触发时,将会把对应的处理函数推送到任务队列当中。html
每一次EventLoop会从任务队列中获取最前面的事件处理函数进行执行。java
注意:每一次Eventloop拥有独立的微任务队列,在每次同步调用堆栈结束后,会检查微任务队列中是否有须要处理的事件,若是有就进行调用.node
当一轮事件循环结束后(Fun1),进行下一轮循环(Fun2).git
根据macrotasks队列和microtasks队列的执行时机不一样,所以须要注意异步代码的执行顺序github
其原则是:web
console.log(1) setTimeout(()=>{console.log(2)},0); Promise.resolve(console.log(3)).then(()=>{console.log(4)}); var ps = new Promise((resolve,reject)=>{console.log(5);resolve(1)}); ps.then(()=>{console.log(6)}); var fs = new Promise((filename)=>{return file.read(filename)}); fs.then((rs)=>{console.log(7)}); //1,3,5,4,6,7,2
refs:
https://github.com/ccforward/cc/issues/48
https://html.spec.whatwg.org/multipage/webappapis.html#task-queueapi