单位网站建设必要性,wordpress 执行sql,桂阳县网站建设公司哪家好,转换短链接平台一、是什么
#x1f37f;#x1f37f;#x1f37f;JavaScript是一门单线程的语言、
意味着同一时间内只能做一件事#xff0c;但是这并不意味着单线程就是阻塞#xff0c;而实现单线程非阻塞的方法就是事件循环
在JavaScript中#xff0c;所有的任务都可以分为
同步任…一、是什么
JavaScript是一门单线程的语言、
意味着同一时间内只能做一件事但是这并不意味着单线程就是阻塞而实现单线程非阻塞的方法就是事件循环
在JavaScript中所有的任务都可以分为
同步任务立即执行的任务同步任务一般会直接进入到主线程中执行异步任务异步执行的任务比如ajax网络请求setTimeout定时函数等
同步任务与异步任务 同步任务进入主线程即主执行栈异步任务进入任务队列主线程内的任务执行完毕为空会去任务队列读取对应的任务推入主线程执行。上述过程的不断重复就事件循环
提示以下是本篇文章正文内容下面案例可供参考
二、宏任务与微任务
如果将任务划分为同步任务和异步任务并不是那么的准确
console.log(1)
setTimeout((){console.log(2)
}, 0)
new Promise((resolve, reject){console.log(new Promise)resolve()
}).then((){console.log(then)
})
console.log(3)如果按照上面流程图来分析代码我们会得到下面的执行步骤
console.log(1)同步任务主线程中执行setTimeout() 异步任务放到 Event Table0 毫秒后 console.log(2)回调推入 Event Queue 中new Promise 同步任务主线程直接执行.then 异步任务放到 Event Tableconsole.log(3)同步任务主线程执行
所以按照分析它的结果应该是 1 ‘new Promise’ 3 2 ‘then’
但是实际结果是1‘new Promise’ 3 ‘then’ 2
出现分歧的原因在于异步任务执行顺序事件队列其实是一个“先进先出”的数据结构排在前面的事件会优先被主线程读取
例子中 setTimeout回调事件是先进入队列中的按理说应该先于 .then 中的执行但是结果却偏偏相反
原因在于异步任务还可以细分为微任务与宏任务
微任务
一个需要异步执行的函数执行时机是在主函数执行结束之后、当前宏任务结束之前
常见的微任务有
Promise.thenMutaionObserverObject.observe已废弃Proxy对象替代