返回

JavaScript 同步与异步执行机制深入剖析

前端

JavaScript 是一门单线程语言,这意味着它一次只能执行一个任务。当一个任务正在执行时,其他任务必须等待。JavaScript 使用事件循环机制来管理任务的执行。事件循环是一个不断运行的循环,它不断从事件队列中取出任务并执行它们。

事件队列是一个存储待执行任务的队列。当一个事件发生时,例如用户点击按钮或计时器到期,就会创建一个新的任务并将其添加到事件队列中。事件循环会不断检查事件队列,如果队列中有任务,就会取出队列中的第一个任务并执行它。

任务有两种类型:同步任务和异步任务。同步任务会在主线程上立即执行,而异步任务会被添加到事件队列中,等待事件循环执行。

同步任务的例子包括:

  • 变量声明
  • 函数调用
  • 算术运算
  • 赋值语句

异步任务的例子包括:

  • setTimeout()
  • setInterval()
  • 网络请求
  • DOM 事件

当一个同步任务正在执行时,主线程会被阻塞,其他任务必须等待。当一个异步任务正在执行时,主线程不会被阻塞,其他任务可以继续执行。

Promise 是 JavaScript 中用来处理异步任务的一种对象。Promise 可以表示一个异步操作的结果,它有三种状态:

  • pending:表示异步操作正在进行中
  • fulfilled:表示异步操作已成功完成
  • rejected:表示异步操作已失败

当一个 Promise 被创建时,它会立即处于 pending 状态。当异步操作完成时,Promise 会转为 fulfilled 或 rejected 状态。

我们可以使用 then() 方法来处理 Promise。then() 方法有两个参数:第一个参数是成功处理程序,第二个参数是失败处理程序。当 Promise 转为 fulfilled 状态时,就会调用成功处理程序。当 Promise 转为 rejected 状态时,就会调用失败处理程序。

setTimeout() 和 setInterval() 是 JavaScript 中用来创建定时器的函数。setTimeout() 函数会在指定的时间后执行一次函数,而 setInterval() 函数会在指定的时间间隔内重复执行一个函数。

setTimeout() 和 setInterval() 函数都是异步函数,它们不会阻塞主线程。这意味着当一个定时器正在执行时,其他任务可以继续执行。

理解 JavaScript 的同步与异步执行机制对于编写高效、可维护的 JavaScript 代码非常重要。通过合理使用同步和异步任务,可以避免主线程被阻塞,从而提高代码的性能。