怎么理解回调函数?

2020-02-26 19:47:16 +08:00
 caowentao

网上对回调的解释不太趋于统一,请教大家怎么理解回调函数 callback?为什么叫做回调?典型应用场景?

4200 次点击
所在节点    程序员
25 条回复
no1xsyzy
2020-02-27 12:01:33 +08:00
就是没有 first-class continuation 所以作出的 workaround,一个编译器很容易做出这样的变换:

label.content = txtbox.value; // MVVM 或者叫 响应式

---

txtbox.on('valuechanged', (value)=>{ label.content=value; }); // 回调

---

txtbox.signalValue.connect(label.slotContent); // Qt 信号槽
FrankHB
2020-02-27 14:36:53 +08:00
这么多楼跑题了那么多,也就半个说到点上的。
控制流(control flow) 在很多时候是个有害的概念,因为过度片面强调程序(源代码)反映的静态结构对程序运行状态的影响,反而给理解添乱。
摆脱这个刻板印象,最直接的方式是在判断程序如何运行的问题上,使用续延(continuation) 的概念代替。(当然,这个理解偏差问题更多毒害写静态语言编译器的,一般用户一时间理解不了也犯不着死磕。)但除非打算实现控制操作符(control operator) ,这里还不需要是一等(first-class) 的。
恐怕对大多数看不清“回调”意义何在的用户来讲,这里真正需要被理解的首先是一等函数(first-class function) 。如果把函数以一等对象(first-class object) 的方式使用——例如拿来当别的函数的参数或返回值,然后适时地允许调用之,自然地就用到了所谓的回调。关键是“不限制”当作参数或返回值以后获得的对象被当作其它函数同等方式地使用。
这个时候,刻意需要理解回调的概念是不必要的,因为只有比较残废的缺乏一等函数的语言中,才会显得要用其它特性来弥补这种一等函数基本功能的缺失的重要性。
——说白了,大部分情况需要强调回调的概念,是因为在用其它特性实现一等函数作为变通。
而如果已经这样自然地用上了回调函数,反而不会(不需要)拿它当一回事儿,这就像把一个不是函数的一等对象当作参数或者返回值一样自然。
至于所谓异步如何如何,什么什么模式如何如何,与其说是回调给你的功能,倒不如说是健全的“函数”本来就该能够实现的东西。只不过只有残废版的函数能用的下,你需要借助其它特性(比如“函数指针”)来变通罢了。
wingpui
2020-02-27 18:39:32 +08:00
回调就是,我就丢块肥皂给你,你喜欢就用,不喜欢可以不搭理,啥时候喜欢啥时候用
Foreverdxa
2020-02-27 20:55:28 +08:00
c 语言 函数指针 就是了,把函数的地址传过去
magiclx
2020-02-27 23:57:05 +08:00
哪里有什么回调,Matrix 中的老鼠夹子罢了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647806

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX