interview
frontend-classic
Node.js

前端经典面试题合集, Node.js

前端经典面试题合集, Node.js

QA

Step 1

Q:: 请解释一下闭包(Closure)是什么,并举一个例子。

A:: 闭包是指在一个函数内部定义的函数,该内部函数可以访问其外部函数的变量。闭包可以使得内部函数 '记住' 外部函数的变量。例子: function outer() { var outerVar = 'I am outer'; function inner() { console.log(outerVar); } return inner; } var innerFunc = outer(); innerFunc(); // 输出 'I am outer'

Step 2

Q:: 什么是事件委托(Event Delegation),如何使用?

A:: 事件委托是指将事件处理器添加到一个父级元素上,而不是每个子元素。通过冒泡机制,事件会从子元素冒泡到父级元素,这样可以简化代码,提高性能。例子: document.getElementById('parent').addEventListener('click', function(event) { if (event.target && event.target.matches('li.item')) { console.log('List item clicked'); } });

Step 3

Q:: 请解释Node.js中的事件循环(Event Loop)及其工作原理。

A:: Node.js中的事件循环是单线程的,它通过非阻塞I/O操作来处理多个并发操作。事件循环的工作流程大致如下:1) 事件循环从事件队列中取出一个事件。2) 如果有与事件关联的回调函数,则执行该回调函数。3) 执行完回调函数后,再次检查事件队列。4) 如果事件队列为空,则等待新的事件。

Step 4

Q:: 什么是回调地狱(Callback Hell),如何避免?

A:: 回调地狱是指在使用回调函数时,代码出现多层嵌套,难以阅读和维护。避免回调地狱的方法包括使用Promise、async/await或生成器函数。例子:使用Promise可以将回调链平坦化。 旧方法: fs.readFile('file1.txt', 'utf-8', function(err, data1) { fs.readFile('file2.txt', 'utf-8', function(err, data2) { fs.readFile('file3.txt', 'utf-8', function(err, data3) { // 处理数据 }); }); }); 新方法: readFile('file1.txt', 'utf-8') .then(data1 => readFile('file2.txt', 'utf-8')) .then(data2 => readFile('file3.txt', 'utf-8')) .then(data3 => { // 处理数据 }) .catch(err => console.error(err));

用途

面试这些内容是为了评估候选人对JavaScript和Node`.js的核心概念和高级特性的理解。这些知识在实际生产环境中非常重要,因为它们影响代码的可维护性、性能和稳定性。比如,闭包常用于数据封装和创建私有变量,事件委托提高了事件处理的效率,事件循环是Node.js非阻塞I/`O的基础,而避免回调地狱则使异步代码更易于管理。\n

相关问题

🦆
什么是Promise,如何使用?

Promise是用于处理异步操作的对象,代表了一个未来可能完成的操作(或失败)。使用Promise可以避免回调地狱,并提供更清晰的代码结构。例子: const myPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve('成功!'); }, 1000); }); myPromise.then(value => console.log(value)).catch(error => console.log(error));

🦆
请解释asyncawait的用法,并举一个例子.

async/await是用于处理异步操作的语法糖,使代码看起来像同步代码,但实际上是异步执行。async函数返回一个Promise,await用来等待Promise的结果。例子: async function fetchData() { try { let response = await fetch('https://api.example.com/data'); let data = await response.json(); console.log(data); } catch (error) { console.log(error); } } fetchData();

🦆
请解释原型链Prototype Chain是什么,并举一个例子.

原型链是JavaScript实现继承的一种机制。当访问一个对象的属性时,如果该属性不存在于对象本身,则会沿着原型链向上查找,直到找到该属性或到达原型链的末端(即null)。例子: function Person(name) { this.name = name; } Person.prototype.greet = function() { console.log('Hello, ' + this.name); }; let person = new Person('Alice'); person.greet(); // 输出 'Hello, Alice' console.log(person.hasOwnProperty('greet')); // 输出 false console.log('greet' in person); // 输出 true