前端经典面试题合集, 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));