浏览器的微任务和宏任务是执行异步任务的两种机制,它们在执行顺序、任务类型和应用场景等方面存在差异。一、宏任务• 定义:宏任务是指那些每次执行时,会将一个或多个任务添加到任务队列中的任务。这些任务通常是由宿主环境提供的,比如浏览器的事件循环机制中的宏任务队列。• 常见类型:• script(整体代码块):当浏览器解析到一个script标签中的代码时,会将其作为一个宏任务添加到任务队列中。例如,一段包含多个函数调用和事件监听的JavaScript代码块。• setTimeout:设置一个定时器,在指定的延迟时间后执行回调函数。比如setTimeout(() => { console.log('这是一个宏任务'); }, 1000); 表示1秒后执行回调。• I/O操作:如网络请求、文件读取等。当发起一个网络请求时,浏览器会将相关的I/O操作作为宏任务处理,在合适的时候执行回调。二、微任务• 定义:微任务是在宏任务执行结束后,立即执行的任务。它们的执行优先级高于宏任务。• 常见类型:• MutationObserver:用于监听DOM的变化。当DOM发生变化时,MutationObserver会触发相应操作,其回调函数会被作为微任务执行。例如,监听某个元素的属性变化。• Promise.then:当Promise状态改变时(从pending变为fulfilled或rejected),其then方法中的回调会被添加到微任务队列中。比如Promise.resolve(1).then(value => console.log(value)); 这里的console.log会在微任务阶段执行。三、执行顺序• 事件循环不断从宏任务队列中取出宏任务执行,每执行完一个宏任务,就会依次执行当前宏任务所产生的所有微任务,然后再从宏任务队列中取下一个宏任务执行,如此循环往复。