【JS 小白也能懂】回调函数:让代码学会「听话办事」的魔法

哈喽各位前端小伙伴~今天咱们来聊聊 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 来优雅解决这个问题~ 但现在咱们先把回调的基础打扎实!

五、总结:回调函数的三大核心知识点​

  1. 本质:把函数作为参数传递给另一个函数,让它在合适的时候调用
  1. 作用:处理异步操作(如网络请求、定时器),定义特定事件发生时的行为
  1. 写法:可以用命名函数(适合复用)或匿名函数(适合简单逻辑)
相关推荐
卸任11 小时前
Vibe coding工具使用心得
前端·ai编程
brien912 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance12 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M12 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写12 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李12 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易12 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马13 小时前
前沿视界
前端
kyriewen13 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易13 小时前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员