简介:
在 JavaScript 中,回调函数(Callback Function) 是一种将一个函数作为参数传递给另一个函数,并在特定条件满足时(如异步操作完成、事件触发等)被调用的机制。它是 JavaScript 处理异步逻辑的核心模式之一。
回调函数的核心概念
函数是一等公民
JavaScript 中函数可以被赋值给变量、作为参数传递、或作为返回值,这种特性使得回调成为可能。控制反转
回调函数将代码执行的控制权交给外部函数,外部函数决定何时调用回调。
回调的典型用途
1.处理异步操作
// 异步操作完成后调用回调
setTimeout(() => {
console.log("1秒后执行");
}, 1000);
2.事件监听
button.addEventListener("click", () => {
console.log("按钮被点击了");
});
3.遍历数组
[1, 2, 3].forEach((num) => {
console.log(num); // 依次输出 1, 2, 3
});
4.处理文件/网络请求
fs.readFile("file.txt", "utf8", (err, data) => {
if (err) throw err;
console.log(data);
});
回调的同步 vs 异步
1.同步回调:立即执行,无延迟。
function syncFunc(callback) {
callback();
}
syncFunc(() => console.log("立即执行"));
2.异步回调:延迟执行,通常与 I/O、定时器相关。
function asyncFunc(callback) {
setTimeout(callback, 1000);
}
asyncFunc(() => console.log("1秒后执行"));
回调地狱(Callback Hell)
多层嵌套回调会导致代码难以维护,形成“金字塔”结构:
doTask1((result1) => {
doTask2(result1, (result2) => {
doTask3(result2, (result3) => {
// 更多嵌套...
});
});
});
解决方案:
使用 Promise
、async/await
或模块化拆分回调函数。
错误优先回调(Error-First Callbacks)
Node.js 中常见的约定:回调函数的第一个参数是错误对象(err
),后续参数是结果。
function readFile(callback) {
fs.readFile("file.txt", (err, data) => {
if (err) {
callback(err); // 传递错误
} else {
callback(null, data); // 成功时 err 为 null
}
});
}
总结
回调函数是 JavaScript 异步编程的基础。
优点:灵活、适合简单异步场景。
缺点:多层嵌套会导致代码可读性差(回调地狱)。
现代替代方案:优先使用
Promise
或async/await
管理异步流程。