interview
frontend-classic
JS 如何顺序执行 10 个异步任务

前端经典面试题合集, JS 如何顺序执行 10 个异步任务?

前端经典面试题合集, JS 如何顺序执行 10 个异步任务?

QA

Step 1

Q:: JS 如何顺序执行 10 个异步任务?

A:: 可以通过以下几种方式来实现: 1. 使用回调函数(callback)来依次执行任务,但这种方法代码难以维护。 2. 使用Promise链,将每个异步任务封装成一个Promise,然后通过.then()方法依次调用。 3. 使用async/await,使代码看起来像同步代码,更加直观。例子如下:

 
async function executeTasks(tasks) {
  for (const task of tasks) {
    await task();
  }
}
const tasks = [task1, task2, task3, ...];
executeTasks(tasks);
 

Step 2

Q:: 什么是闭包?如何在JavaScript中使用闭包?

A:: 闭包是指那些能够访问自由变量的函数。换句话说,函数可以记住并访问其词法作用域,即使函数在其词法作用域之外执行。使用闭包的一个常见场景是创建私有变量。例如:

 
function createCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  }
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
 

Step 3

Q:: 解释一下事件循环(Event Loop)机制

A:: 事件循环是JavaScript处理异步操作的一种机制。JavaScript是单线程的,通过事件循环来处理异步任务,包括回调函数、Promise等。事件循环的主要步骤是: 1. 执行栈中的同步任务依次执行。 2. 当遇到异步任务时,将其挂起并继续执行其他同步任务。 3. 当异步任务完成时,将其回调函数加入到任务队列。 4. 事件循环不断检查执行栈是否为空,如果为空则从任务队列中取出回调函数并执行。

Step 4

Q:: Promise的状态有哪些?

A:: Promise有三种状态: 1. Pending(等待):初始状态,既不是成功,也不是失败。 2. Fulfilled(已实现):操作成功完成。 3. Rejected(已拒绝):操作失败。 一个Promise一旦从Pending状态变为Fulfilled或Rejected,就不会再改变状态。

Step 5

Q:: 什么是原型链?

A:: 原型链是JavaScript实现继承的一种方式。每个对象都有一个原型对象(proto),当访问一个对象的属性时,如果该对象本身没有这个属性,则会沿着原型链向上查找,直到找到该属性或到达原型链的顶端(即Object.prototype)。

用途

面试这些内容是为了评估候选人对JavaScript核心概念的理解和掌握程度。在实际生产环境中,这些知识可以帮助开发者编写高效、健壮的代码,并且能够有效地处理异步任务、理解和使用闭包、掌握事件循环的工作机制等,这些都是日常开发中常见的场景。\n

相关问题

🦆
解释一下asyncawait的工作原理

async/await是ES2017引入的语法糖,用于简化Promise的使用。async函数返回一个Promise,await可以暂停async函数的执行,等待Promise解决后继续执行。例子:

 
async function fetchData() {
  let response = await fetch('url');
  let data = await response.json();
  return data;
}
 
🦆
什么是事件冒泡和事件捕获?

事件冒泡是指事件从目标元素向上冒泡到最顶层的document。事件捕获是指事件从最顶层的document向下捕获到目标元素。可以通过addEventListener的第三个参数来指定使用捕获或冒泡阶段:

 
element.addEventListener('click', handler, true); // 捕获阶段
 
🦆
如何处理JavaScript中的内存泄漏?

JavaScript中的内存泄漏通常是由于未能释放不再使用的对象。常见的内存泄漏包括: 1. 意外的全局变量。 2. 被遗忘的定时器或回调。 3. 闭包中的未释放变量。 4. DOM引用未能清理。可以通过使用垃圾回收机制、手动清理引用、避免不必要的全局变量等方法来避免内存泄漏。

🦆
解释一下JavaScript的作用域和作用域链

作用域是变量和函数的可访问范围。JavaScript有全局作用域和函数作用域。ES6引入了块级作用域(let和const)。作用域链是指在访问一个变量时,JavaScript会从当前作用域开始查找,找不到则沿着作用域链向上查找,直到全局作用域。