为什么javascript是单线程?
因为javascript作为浏览器脚本语言一定是单线程的,如果javascript同时有两个线程,一个线程在某个dom节点上进行添加内容,一个线程在dom上删除内容,那么浏览器究竟以哪个线程为准?
javascript是单线程,怎么执行异步?
单线程就意味着上一个任务执行完成,才能执行下一个任务,所以我们需要了解javascript的执行流程

引用js中的宏任务与微任务 - 知乎 (zhihu.com)
(图左:同步任务)
(图右:事件循环)【宏任务,微任务】
微任务 promise.then() ==> then里面的才是微任务
宏任务 setTimeout,setInterval....
执行流程
同步任务==>微任务==>宏任务

图解: 先执行完所有的同步任务,再去执行所有的微任务,最后执行宏任务,执行完成后再事件循环,有微任务的话,再执行完成所有的微任务,然后去执行宏任务,依次事件循环
问题
1.输出多少(几秒输出几)
for(var i = 0;i < 3; i++){
setTimeout(function(){
alert(i)
},1000*i)
}
答案:3 3 3
解题思路:同步任务三次for循环,里面的事件循环中的宏任务是不执行的,i=3;
同步任务执行完成后,开始执行事件循环中的三个宏任务,定时器
2.输出顺序
setTimeout(function(){
console.log('1')
})
new Promise(resolve=>{
console.log('1promise')
resolve()
}).then(()=>{
console.log('微任务1')
}).then(()=>{
console.log('微任务2')
})
console.log('2')
答案:1promise 2 微任务1 微任务2 1
网友评论