JavaScript中 分为 同步任务 异步任务(宏任务 微任务)
同步任务
在 JavaScript 中,同步任务指的是那些在主线程上按顺序直接执行的任务,不需要等待其他任务完成即可立即执行。同步任务的特点是阻塞式的,即一个任务没有执行完成之前,后面的代码不会执行。
常见的同步任务
普通函数调用 普通的函数调用是同步的,函数内部的代码会按照书写顺序依次执行。
表达式和语句 算术运算、赋值、条件判断(if/else)、循环(for/while)等基本的表达式和语句都是同步执行的。
DOM 操作 直接操作 DOM(Document Object Model)的代码,如修改元素属性、添加或删除节点等,通常也是同步的。
字符串和数组方法 大多数字符串和数组的内置方法,如
push()
,pop()
,slice()
,indexOf()
,split()
,join()
等,都是同步执行的。Math 和 Date 方法 数学和日期对象的大部分方法,如
Math.random()
,Math.floor()
,Date.now()
等,都是同步执行的。读取和设置变量 读取和设置变量的值是同步的,这意味着变量的读写操作会立即反映出来。
立即执行函数表达式 立即执行的函数表达式会在定义时立即执行,其内部的代码也是同步执行的。
模板字符串 ES6 引入的模板字符串是同步执行的,用于字符串拼接和插值。
异步任务
异步任务是指那些不会立即执行,而是被安排在稍后的时间点执行的任务。异步任务的设计是为了避免阻塞主线程,提高程序的响应性和效率
常见的异步任务
宏任务 (宏任务(Macro-tasks)指的是那些在单次事件循环中能够独立完成的任务。每个宏任务完成后,事件循环会检查微任务队列并执行所有微任务,然后再继续下一个宏任务)
setTimeout
和setInterval
定时器任务,其中setTimeout
会在设定的延迟时间后执行一次,而setInterval
则会每隔设定的时间间隔重复执行。
setImmediate
:在 Node.js 环境中,setImmediate
会在当前事件循环结束时执行,它比setTimeout
优先级高,但仍然属于宏任务。
process.nextTick
:虽然process.nextTick
在 Node.js 中的行为类似于微任务,但它实际上是独立于事件循环的一个特殊宏任务,且优先级高于其他宏任务。微任务 (微任务(Microtasks)是在每次宏任务执行完毕后立即处理的任务。这意味着在执行下一个宏任务之前,所有排队的微任务都会被处理完毕)
Promise 回调 当 Promise 对象的状态从 pending 变为 resolved 或 rejected 时,其相关的回调函数会被加入到微任务队列中等待执行。
async/await 结构中的 await 表达式 在 async 函数内部使用 await 关键字等待一个 Promise,当 Promise 完成时,async 函数体内的后续代码将作为微任务执行。
同步任务首先执行,接着是微任务(由Promise的
.then,async/await
方法产生的),最后是宏任务(由setTimeout,
setInterval
产生的)