下面的一段JS代码
<script>
setTimeout(function(){
console.log("1")
});
new Promise(function(resolve){
console.log("2")
resolve();
}).then(function(){
console.log("3")
})
console.log("4")
</script>
上面的的运行结果是
2
4
3
1
百思不得其解,为什么是2先出,setTimeout后面没有秒数不是应该直接执行吗?,而且3不是应该在2后面输出吗?为什么到4后面了?
setTimeout 默认值是0,所以2先出
然后不管同步还是异步,在浏览器端,Promise会使用MutationObserver监听一个document.createTextNode(''),然后通过改变node.data的值来触发observer,执行callback,而在事件循环中,MutationObserver属于微任务,会比setTimeout 先运行
es6-promise asap.js