记录与转载:前端知识文章——JavaScript 执行机制、Event Loop 与 setTimeout
一、JavaScript 执行机制
JavaScript 是一种单线程脚本语言,这意味着它一次只能执行一个任务。为了应对这种单线程带来的问题(如长时间运行的任务会阻塞后续任务的执行),JavaScript 采用了事件驱动和异步事件处理机制,即 Event Loop(事件循环)。
JavaScript 的执行机制可以概括为以下几个步骤:
- 创建执行上下文:当 JavaScript 代码执行时,会创建一个全局执行上下文(在浏览器中是 window 对象)。函数被调用时,会创建一个新的函数执行上下文,并成为当前执行上下文。
- 执行栈(Call Stack):JavaScript 引擎通过执行栈来管理执行上下文。当函数调用时,新的执行上下文被推入栈中,当函数执行完毕,执行上下文从栈中弹出。
- 代码执行:JavaScript 引擎会按照顺序执行栈中的执行上下文,直到栈为空。
二、Event Loop
Event Loop 是 JavaScript 异步编程的核心机制。它允许 JavaScript 引擎在等待某些异步操作(如网络请求、文件读取等)完成时,不阻塞后续代码的执行。
Event Loop 的工作原理如下:
- 同步代码执行:JavaScript 引擎首先执行栈中的同步代码。
- 异步任务处理:当遇到异步任务(如 setTimeout、Promise、Ajax 请求等)时,JavaScript 引擎会将任务交给相应的异步处理机制(如 Timer、Promise 队列、微任务队列等)。
- 事件循环:当栈为空时,Event Loop 会检查异步任务队列。如果队列中有任务,JavaScript 引擎会将任务推入栈中执行。这个过程会不断重复,形成事件循环。
三、setTimeout
setTimeout 是 JavaScript 中常用的定时器函数,用于在指定的时间后执行一段代码。
setTimeout 的工作原理如下:
- 设置定时器:当调用 setTimeout 函数时,JavaScript 引擎会将定时器任务交给 Timer 异步处理机制。
- 等待时间:Timer 会等待指定的时间(以毫秒为单位)。
- 任务入队:当时间到达后,Timer 会将定时器任务添加到任务队列中。
- 任务执行:当执行栈为空时,Event Loop 会将任务队列中的任务推入栈中执行。
需要注意的是,setTimeout 的执行时间并不是精确的。由于 JavaScript 是单线程的,如果执行栈中有长时间运行的任务,setTimeout 的回调函数可能会被延迟执行。
参考文章:
这一次,彻底弄懂 JavaScript 执行机制
:本文详细讲解了 JavaScript 的执行机制、Event Loop 以及 setTimeout 的工作原理,对于深入理解 JavaScript 异步编程非常有帮助。
转载说明:
本文内容基于开源项目 stephentian/33-js-concepts 中的相关知识点进行整理与记录,并参考了 AlloyTeam 团队的博客文章。转载本文时,请尊重原作者的知识产权,注明原文出处及作者信息。