- 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
全部代码、setTimeout
、setInterval
、setImmediate....
微任务):* Process.nextTick(Node独有)
、Promise....
这里就有一个规定 微任务始终在宏任务之前执行 [她就是执行的 记住就完事了]
2 js.堆 栈 队列
堆: 堆是指一块已分配的用来存储所需数据的存储空间
栈 (先进后出); 可以看作一个按照顺序排列的消息数据集合。
队列 : 可以看作是指一个按照顺序排列的消息事件集合。 (先进先出)