关于 微任务 和 宏任务的一些机制

  1.  promise 和 setTimeout设置时间为 0ms[或者不设置]  那个先运行?
 1 setTimeout(function(){
 2     console.log('定时器开始啦')
 3 });
 4 
 5 new Promise(function(resolve){
 6     console.log('马上执行for循环啦');
 7     for(var i = 0; i < 10000; i++){
 8         i == 99 && resolve();
 9     }
10 }).then(function(){
11     console.log('执行then函数啦')
12 });
13 
14 console.log('代码执行结束');

//output:
//马上执行for循环啦
//代码执行结束
//执行then函数啦
//定时器开始啦


这玩意就涉及带js的运行机制了  由于js 是单线程的  做事情就需要排队  这样就会造成阻塞  这是 机智的人类就想到了异步; 我在某些地方看到 在js中像写回调函数可以写出来,但异步主要是通过一些想什么 addEventListener (听说这个好像是的) ,setTimeout,....之类来实现异步 [ 顺便插一句 异步函数一定在同步语句执行之后在执行 而且 异步函数里面一定有回调 但回调函数不一定是异步 ]  ;

说到异步 就要说到 event loop 刚开始我以为这就是 for循环之类的玩意儿.

event loop[事件循环]

同步的东西都在主线程执行,而异步则是进入了一个 任务线程 那么此时就产生了一个疑问 这多开了一个任务队列 

① 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

② 主线程之外,还存在一个‘任务队列’(task queue)。只要异步任务有了运行结果,就在”任务队列”之中放置一个事件。

③ 一旦主线程的栈中的所有同步任务执行完毕,系统就会读取任务队列,选择需要首先执行的任务然后执行。

这也算是 js 中异步的实现机制了吧; 然而问题 往往没那么简单  异步任务里面 又分为 微任务和宏任务 真的够了;

宏任务):* script全部代码、setTimeoutsetIntervalsetImmediate....

微任务):* Process.nextTick(Node独有)Promise.... 

这里就有一个规定 微任务始终在宏任务之前执行  [她就是执行的 记住就完事了]

2 js.堆 栈 队列 

堆:     堆是指一块已分配的用来存储所需数据的存储空间

栈 (先进后出);  可以看作一个按照顺序排列的消息数据集合。
 
队列 : 可以看作是指一个按照顺序排列的消息事件集合。 (先进先出)
原文地址:https://www.cnblogs.com/diligent-noob/p/12787010.html