通俗的理解:
想象一个场景:你(主函数)让你朋友(另一个函数)帮你去楼下取快递。
1. 同步模式(没有回调函数)你说:“朋友,帮我去取快递。” 朋友说:“好。” 然后你就站在原地,什么都不干,一直等。 直到朋友把快递拿到你面前,你才继续做下一件事(比如拆快递)。 缺点:在等待的这段时间里,你被“卡住”了,完全浪费了。
2. 异步模式(使用回调函数)这种情况更聪明: 1. 你说:“朋友,帮我去取快递,取到了就给我送到客厅桌子上(这是一个预先说好的动作)。” 2. 说完这句话,你不用站在原地傻等,可以马上去做别的事情,比如去刷手机、打游戏。 3. 你朋友在楼下取到快递后,他会自动地、主动地执行你之前交代的“送到客厅桌子上”这个动作。 你打完一局游戏,去客厅,发现快递已经在那儿了。
把这个场景翻译成 JavaScript 代码:
- // 1. 首先,定义你让朋友“取到快递后要做的事”
- // 这就是一个“回调函数”
- function 快递到了之后(快递内容) {
- console.log(`我把快递【${快递内容}】放到客厅桌子上了!`);
- }
- // 2. 你的朋友就是一个函数,他接受两个参数:
- // - 取件码 (他工作需要的信息)
- // - 一个“取到后要做的事”的指令 (这就是回调函数!)
- function 朋友(取件码, 取到后要做的事) {
- console.log(`好的,我用取件码【${取件码}】去取快递...`);
- // 模拟下楼的耗时(比如2秒)
- setTimeout(() => {
- // 假设这就是取到的快递
- const 取到的快递 = "一本新买的书";
- // !!!最重要的部分来了!!!
- // 朋友取到快递后,他“回调”了你给他的那个函数
- // 也就是说,他主动执行了你之前交代的任务
- 取到后要做的事(取到的快递);
- }, 2000);
- }
- // 3. 你开始派任务
- console.log("我开始派朋友去取快递");
- 朋友("123456", 快递到了之后); // 把“回调函数”作为参数传进去
- console.log("我继续去打游戏了...(主线程继续执行)");
- // 执行结果会是这样:
- // > "我开始派朋友去取快递"
- // > "好的,我用取件码【123456】去取快递..."
- // > "我继续去打游戏了...(主线程继续执行)"
- // (等待2秒后...)
- // > "我把快递【一本新买的书】放到客厅桌子上了!"
复制代码
核心总结:1. 回调函数是什么? 2. 就是一个函数A,被当做参数传给另一个函数B。函数B在完成自己的任务后,会自动调用这个传进来的函数A。 3. 为什么用它?(主要目的) 4. 为了实现 “异步编程” 。让耗时的操作(如取快递、读文件、网络请求)在后台慢慢做,而不阻塞主程序。主程序可以继续往下执行,等耗时操作完成时,通过回调函数来“通知”你结果。 5. 关键理解点: l 你不是“调用”回调函数,你是“定义”它然后“传递”它。 l 是接收你函数的那个函数(你朋友)在合适的时机“调用”它。 l 在JavaScript中,这种模式无处不在,尤其是在处理事件、定时器、网络请求时。 简单说:回调函数就是“事后诸葛亮”——你先告诉程序一件事完成后该怎么做,然后就不用管了,程序做完那件事后会自己回来执行你交代的步骤。
|