Javascript是一门单线程语言,这意味着在同一时间内只能执行一个任务。为了使JavaScript实现并发操作和异步处理,引入了事件循环(Event Loop)的概念。
事件循环的定义
事件循环可以被认为是 JavaScript 执行运行时的方法。它允许 JavaScript 进程在执行代码、处理事件和等待异步操作完成时保持响应能力。
所有的异步事件(例如点击、计时器、请求等)都会被添加到事件队列中。当主线程空闲时,它会从事件队列中取出第一个事件并将其执行。这个过程不断重复,直到事件队列为空。
图示如下:
事件循环的执行顺序
事件循环的执行顺序分为两层:
第一层是macrotask,也就是宏任务队列。比如setTimeout/setInterval、setImmediate、I/O操作等,每次选择macrotask中最先进入队列的任务执行。
第二层是microtask,也就是微任务队列。比如Promise.then()、process.nextTick()等,每次选择microtask队列中的所有任务依次执行,直到清空微任务队列为止。
图示如下:
示例代码
--------------------- ------------- -- - ------------------ - ---- -- --- ------------------------- -- - -------------------- - ---- --- -------------------
输出结果为:
----- --- ------- - - ----- - -
解释:首先执行console.log('start')和console.log('end'),然后将setTimeout()和Promise.resolve()添加到宏任务队列和微任务队列中。由于Promise.then()的优先级高于setTimeout(),所以先执行Promise.then(),输出'promise - 2',再执行setTimeout(),输出'timer - 1'。
学习和指导意义
理解事件循环是成为一名JavaScript开发人员的重要基础。合理利用事件循环可以避免阻塞主线程,提高应用程序的响应能力和性能。在编写异步代码时,建议使用Promise等微任务进行处理,而不是使用setTimeout等宏任务。同时,在使用异步代码时应该注意错误处理和资源释放问题,以便保持应用程序的稳定性和可维护性。
参考资料:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/11272