什么是「回调函数」 Callback Function ?
我们用一个生活中最常见的例子来通俗地解释回调函数 (Callback Function)。
想象一下你去一家很火的餐厅点餐。
场景:点一杯奶茶
- 你(主程序):走到柜台,对服务员说:“我想要一杯珍珠奶茶。”
- 服务员(一个需要花时间的函数,比如
makeTea
):对你说:“好的,但是现在人多,做奶茶需要5分钟。您不能一直站在这里干等。” - 服务员接着说:“这样吧,您把您的手机号告诉我。奶茶做好了,我打电话通知您。”
在这个场景里:
- “打电话通知您” 这个动作,就是 回调 (Callback)。
- 你留下的**“手机号”**,就是 回调函数 (Callback Function)。
拆解一下这个过程:
- 你把“手机号”交给了服务员:这对应着,你把一个函数 (Callback Function) 作为参数传递给了另一个函数 (
makeTea
函数)。 - 你去做别的事了:你不用傻等,可以去逛逛街、玩玩手机。这对应着,你的主程序不会被卡住(阻塞),可以继续执行其他代码。这就是异步。
- 奶茶做好了(事件发生):服务员完成了他的任务。
- 服务员拨打你的手机号(执行回调):
makeTea
函数在它自己的任务完成后,回过头来调用了你当初留给它的那个函数(你的“手机号”)。 - 你接电话(回调函数里的代码被执行):你收到通知,然后说:“好的,我马上过来取!”。这个“过来取”的动作,就是定义在回调函数内部的逻辑。
总结成一句话定义:
一个回调函数,就是你传递给另一个函数A的“B函数”,并告诉A:“你先忙你自己的事,等你忙完了,再回过头来调用我给你的这个B函数。”
为什么需要它?
主要用于两种情况:
- 处理耗时操作(异步编程):
- 比如:网络请求、读取文件、定时器。程序不能一直等着这些操作完成,所以就先注册一个回调函数,告诉程序“等你完成了再叫我”。
- 让代码更灵活(事件处理):
- 比如:你给一个按钮添加点击事件。
button.onClick( function() { alert('你点我了!'); } )
- 这里
function() { ... }
就是一个回调函数。你把它交给了onClick
方法,并告诉它:“我不知道用户什么时候会点击,但一旦用户点击了,你就帮我执行这个函数。”
简单来说,回调就是一种“你先忙,忙完叫我”的编程模式。