js 中经常会用到回调函数,为什么叫回调函数呢?

2019-12-20 14:59:48 +08:00
 feigle

比如下面的代码:

function a(callback){

    var m = 1;
    var n = 2;
    alert(callback(m,n));
}

function b(m,n){

    return m+n;
}

a(b);

程序运行到 a(b);时,不是执行 a 函数吗,然后 a 函数体中调用了 b 函数。 有人说,回调函数,是当父函数执行完后再去执行传入的函数,感觉不能理解。

7029 次点击
所在节点    JavaScript
35 条回复
jeodeng
2019-12-20 15:03:43 +08:00
function a(callback) {
console.log(1);
callback();
console.log(2);
}

function b() {
console.log('callback');
}

a(b)

输出 1 callback 2,我不认为是 a 执行完以后再去执行 b
manami
2019-12-20 15:05:55 +08:00
callback 翻译问题,就像 java 语言 robust—“鲁棒性”
sunsai
2019-12-20 15:07:01 +08:00
把 b 函数调用的控制权交给了 a, a 可以调用也可以不调用, 具体什么时候调用, 调用几次, 都不是 b 自己可以控制的
Sapp
2019-12-20 15:13:52 +08:00
根本不是一码事,你写的是回调函数,但你这是最基础定义的回调函数,而你后面那个有人说的,是通常意义上的异步回调函数,实际哪怕是异步也说错了,只是在很多情况下,异步回调是会导致父函数的同步执行完了才调用它而已,但是这不代表所有的都是这样,这只是一个结果,但是不是定义。
一般的回调函数是指传入的到了某个特定的时候调用的函数,这个可能是一个异步也可能是同步,这个特定的时候可能是指这个函数整体执行完毕,也可能是这个函数某一部分执行完毕
JerryCha
2019-12-20 15:19:59 +08:00
和事件机制有点关系,这个需要踩了坑才能理解为什么是这样
![WX20191220-151853@2x.png]( https://i.loli.net/2019/12/20/jqVF8txmSvwHn9l.png)
yumc
2019-12-20 15:30:02 +08:00
我不懂但是我说一下我的理解:
回调函数和其他面向对象语言的接口回调相似,方法 a 已经实现具体的功能,但是在方法 a 内部某些地方会调用 b 方法,b 方法没有被实现,依赖于外部实现。
eason1874
2019-12-20 15:35:32 +08:00
有函数的语言就有回调函数,通过传参给另一个函数去调用的函数就叫回调函数。有同步回调,也有异步回调,不同语言的回调形式可能有所不同。

同步回调的就是通过参数给你的(函数)代码过程再插入一段代码(回调函数),回调函数的功能一般是 filter (处理部分数据)或者 action (增加一个动作)。

异步回调大多是因为执行函数本身就是异步,非阻塞,不等结果返回,你在代码过程不能获得函数执行结果,所以就只能通过异步回调,先传参,等函数执行完了函数再根据参数调用你要执行的处理函数,把结果传给它。
will0404
2019-12-20 15:36:23 +08:00
新手容易在各种专有名词上纠结,没有必要太较真。

a 的参数是个函数,如此而已。当这个参数命名为 callback 时,它多半是在告诉调用它的人,我会在某个时刻调用它,一般在我先去做一些别的事之后。因此 callback 这个命名往往出现在异步函数定义中,这是种默契,而非官方约定。
huijiewei
2019-12-20 15:40:08 +08:00
callback 只是一个命名约定
learnshare
2019-12-20 15:40:23 +08:00
你的代码在演示闭包,也算是一种回调

回调在现实生活中比较好解释:
师傅修车的时候,喊徒弟 [拿个螺丝刀] ,这是回调的前提,可能的结果有以下几种
1. 同步成功:徒弟 [直接递上螺丝刀]
2. 同步失败:徒弟说 [螺丝刀在你手里]
3. 异步成功:徒弟找了一圈, [拿来了螺丝刀]
4. 没有回调:徒弟装作没听见
azcvcza
2019-12-20 15:41:07 +08:00
程序这东西,解释专有名词很费劲,但是写起来也就那样把。
kop1989
2019-12-20 15:43:31 +08:00
回调函数( callback )其实是一种通用约定,用于描述将函数调用权交给其他(人、线程、进程、接口等)未知第三方的一种做法。lz 举的例子是最简单的一种实现方式,但不限于此。
只要是把触发、调用权交给对方的,都叫回调函数。
qiayue
2019-12-20 15:46:52 +08:00
举一个真实例子,用户微信支付完成后,微信支付服务器调用你的接口,告诉你支付数据,这也叫做回调。
回头再调的意思。
enjoyCoding
2019-12-20 15:48:40 +08:00
普遍意义上我们嘴中的回调是要有异步操作的,异步操作之后触发的函数就被叫做回调函数.
sixway
2019-12-20 15:50:19 +08:00
可以说是异步操作
wangxiaoaer
2019-12-20 15:54:14 +08:00
callback = call - back = 反过来 call =反过来调用 = 回调

我觉得这个翻译听贴切的。

回到你的例子:

a(b) == 你调用 a (发起者是你)然后 a 调用 b()(发起者是 a ),从发起者的角度看是反过来了。
wangyzj
2019-12-20 15:57:19 +08:00
你写的是函数指针
不是基于单线程事件的回调函数
zenxds
2019-12-20 15:59:13 +08:00
你在淘宝买了个东西,东西到了快递打电话给你去取就是回调,这是一个异步的过程,难不成你下了单就一直卡着等吗
hehheh
2019-12-20 15:59:46 +08:00
上过微机原理的课肯定听说过 interrupt,虽然不是一码事,可是是一个道理
1KN6sAqR0a57no6s
2019-12-20 16:12:58 +08:00
1、“回调函数,是当父函数执行完后再去执行传入的函数。” 这句话是错误的,父函数并不是呆呆地执行每一个以参数形式传进来的回调函数,它有可能在适当的时机调用,也可能永远不调用。2、回调函数本质上是“面向未来编程”,当我开始做一件事的时候(父函数),有些伴生的事明明还没有发生(事件、条件),我已经想好了应对这些可能事件的方法(回调函数)。3、“面向未来编程”的通俗名字是异步编程,用回调函数的形式写代码只是异步编程的一种模板,你也可以用“监听事件 /触发事件”这样的模板来进行异步编程。

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

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

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

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

© 2021 V2EX