哈喽各位前端小伙伴~今天咱们来聊聊 JavaScript 里超重要又超有趣的「回调函数」!别怕,咱不用枯燥的术语,用生活化的例子带你秒懂这个「让函数学会听话」的神奇技能~ 🧙♂️
一、啥是回调?先看一个超简单的例子!
想象你点了一杯奶茶,店员说:"做好了我喊你哈~" 这时候你就可以去干别的事,等店员喊你再回来取。这里的「等店员喊你」就是一个「回调」!
用代码来模拟就是这样:
javascript
// 定义一个"买奶茶"的函数,接收一个"通知函数"作为参数
function buyMilkTea(callback) {
console.log("正在制作奶茶...需要3分钟");
// 模拟制作时间
setTimeout(function() {
console.log("奶茶做好啦!");
// 做好之后调用传入的通知函数
callback();
}, 3000);
}
// 定义具体的"取奶茶"动作
function takeMilkTea() {
console.log("开心地拿走奶茶~");
}
// 去买奶茶的时候告诉店员:做好了就调用takeMilkTea()通知我
buyMilkTea(takeMilkTea);
这里的核心就是:把函数当作礼物送给另一个函数,等它办完事儿就会拆开这份礼物调用它,这就是回调函数的本质!
二、项目中最常用的回调场景:网络请求
前端开发中最常见的回调应用就是「发送网络请求」啦~比如从服务器获取数据后需要渲染页面,这时候就需要告诉请求函数:"拿到数据后记得调用这个函数处理哦!"
基础版:用命名函数当回调
javascript
// 定义请求函数,接收url和回调函数
function sendRequest(url, callback) {
console.log(`正在向${url}发送请求...`);
// 模拟异步请求,1秒后返回数据
setTimeout(function() {
var data = ["javascript", "前端入门", "ES6高级"];
// 拿到数据后调用回调函数,并把数据传过去
callback(data);
}, 1000);
}
// 定义处理数据的函数
function processData(data) {
console.log("拿到数据啦:", data);
// 这里可以写渲染页面的代码~
data.forEach(item => {
console.log(`渲染内容:${item}`);
});
}
// 发起请求并传入处理函数
sendRequest("https://api.example.com/data", processData);
进阶版:直接传匿名函数(更简洁的写法)
javascript
sendRequest("<https://api.example.com/data>", function(data) {
console.log("拿到数据啦:", data);
// 直接在这里写处理逻辑,不用额外定义函数
});
实际开发中更常见的是直接写一个没有名字的函数当回调,这样代码更紧凑:
三、回调函数的「两面性」:这些场景都在用!
1. 事件监听:让按钮「听懂」你的点击
比如给按钮加点击事件:
javascript
// 按钮点击时要执行的函数就是回调
button.addEventListener('click', function() {
console.log("用户点击了按钮!");
});
这里的匿名函数就是回调,它告诉浏览器:"当点击事件发生时,就调用这个函数哦~"
2. 数组遍历:让 forEach 知道怎么处理每个元素
typescript
var numbers = [1, 2, 3, 4];
numbers.forEach(function(number) {
console.log("当前数字是:", number);
});
这里传给 forEach 的函数就是回调,它定义了「遍历每个元素时要执行的操作」。
3. 定时器:让代码定时执行任务
javascript
// 3秒后要执行的函数就是回调
setTimeout(function() {
console.log("时间到啦!该执行任务了~");
}, 3000);
四、回调函数的「坑」:小心回调地狱!
javascript
sendRequest(url1, function(data1) {
sendRequest(url2, function(data2) {
sendRequest(url3, function(data3) {
// 最内层的回调,代码缩进越来越深...
});
});
});
这种情况就像掉进了一个深不见底的坑,代码变得很难读和维护。不过别担心,后面我们会用 Promise 和 async/await 来优雅解决这个问题~ 但现在咱们先把回调的基础打扎实!
五、总结:回调函数的三大核心知识点
- 本质:把函数作为参数传递给另一个函数,让它在合适的时候调用
- 作用:处理异步操作(如网络请求、定时器),定义特定事件发生时的行为
- 写法:可以用命名函数(适合复用)或匿名函数(适合简单逻辑)