关于JS
js是一门单线程语言, 单线程的意思是 js执行环境中负责执行代码的线程只有一个
js最早是一门运行在浏览器端的脚本语言, 目的是为了实现页面上的动态交互, 核心就是 DOM 操作, 这就决定了他必须使用单线程模式工作 (多线程的情况下, 我在一个线程修改dom, 另一个线程删除dom就会出现线程同步问题)
一个线程一次就只能执行一个问题, 多个问题需要处理的情况就需要排队, 安全简单, 但容易阻塞
js的异步模式:
1.不会等待这个任务的结束才开始下一个任务
2.对于耗时操作开启过后就立即往后执行下一个任务
3.耗时任务的后续逻辑一般通过回调函数的方式定义, 耗时任务完成过后就会自动执行传入的回调
console.log('global begin')
setTimeout(function(timer1(){
console.log('timer1 invoke')
},1800)
setTimeout(function timer2(){
console.log('timer2 invoke')
setTimeout(function inner(){
console.log('inner invoke')
},1000)
},1000))
console.log('global end')
setTimeout 是异步调用, 内部的API环境就是为回调函数开启了一个倒计时器,放到一边,这里的倒计时器是单独工作的, 并不会受js线程影响, 在web中对应线程开启, 计时结束后就将回调函数推入事件队列, 等待主执行栈空闲的时候读取调用, ajax, dom操作类似
宏任务与微任务
宏任务和微任务都是异步任务,都在任务队列中,但是它们在不同的队列中
- 重点:在准备取出每个宏任务准备执行前要执行完所有的微任务
- 宏任务:script整体代码, setTimeout, setInterval…
-
微任务:Promise.then, MutationObserver, process.nextTick (node中)