比如下面的代码:
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 函数。 有人说,回调函数,是当父函数执行完后再去执行传入的函数,感觉不能理解。
1
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 |
2
manami 2019-12-20 15:05:55 +08:00 via Android
callback 翻译问题,就像 java 语言 robust—“鲁棒性”
|
3
sunsai 2019-12-20 15:07:01 +08:00 1
把 b 函数调用的控制权交给了 a, a 可以调用也可以不调用, 具体什么时候调用, 调用几次, 都不是 b 自己可以控制的
|
4
Sapp 2019-12-20 15:13:52 +08:00
根本不是一码事,你写的是回调函数,但你这是最基础定义的回调函数,而你后面那个有人说的,是通常意义上的异步回调函数,实际哪怕是异步也说错了,只是在很多情况下,异步回调是会导致父函数的同步执行完了才调用它而已,但是这不代表所有的都是这样,这只是一个结果,但是不是定义。
一般的回调函数是指传入的到了某个特定的时候调用的函数,这个可能是一个异步也可能是同步,这个特定的时候可能是指这个函数整体执行完毕,也可能是这个函数某一部分执行完毕 |
5
JerryCha 2019-12-20 15:19:59 +08:00
|
6
yumc 2019-12-20 15:30:02 +08:00
我不懂但是我说一下我的理解:
回调函数和其他面向对象语言的接口回调相似,方法 a 已经实现具体的功能,但是在方法 a 内部某些地方会调用 b 方法,b 方法没有被实现,依赖于外部实现。 |
7
eason1874 2019-12-20 15:35:32 +08:00 1
有函数的语言就有回调函数,通过传参给另一个函数去调用的函数就叫回调函数。有同步回调,也有异步回调,不同语言的回调形式可能有所不同。
同步回调的就是通过参数给你的(函数)代码过程再插入一段代码(回调函数),回调函数的功能一般是 filter (处理部分数据)或者 action (增加一个动作)。 异步回调大多是因为执行函数本身就是异步,非阻塞,不等结果返回,你在代码过程不能获得函数执行结果,所以就只能通过异步回调,先传参,等函数执行完了函数再根据参数调用你要执行的处理函数,把结果传给它。 |
8
will0404 2019-12-20 15:36:23 +08:00
新手容易在各种专有名词上纠结,没有必要太较真。
a 的参数是个函数,如此而已。当这个参数命名为 callback 时,它多半是在告诉调用它的人,我会在某个时刻调用它,一般在我先去做一些别的事之后。因此 callback 这个命名往往出现在异步函数定义中,这是种默契,而非官方约定。 |
9
huijiewei 2019-12-20 15:40:08 +08:00
callback 只是一个命名约定
|
10
learnshare 2019-12-20 15:40:23 +08:00
你的代码在演示闭包,也算是一种回调
回调在现实生活中比较好解释: 师傅修车的时候,喊徒弟 [拿个螺丝刀] ,这是回调的前提,可能的结果有以下几种 1. 同步成功:徒弟 [直接递上螺丝刀] 2. 同步失败:徒弟说 [螺丝刀在你手里] 3. 异步成功:徒弟找了一圈, [拿来了螺丝刀] 4. 没有回调:徒弟装作没听见 |
11
azcvcza 2019-12-20 15:41:07 +08:00
程序这东西,解释专有名词很费劲,但是写起来也就那样把。
|
12
kop1989 2019-12-20 15:43:31 +08:00
回调函数( callback )其实是一种通用约定,用于描述将函数调用权交给其他(人、线程、进程、接口等)未知第三方的一种做法。lz 举的例子是最简单的一种实现方式,但不限于此。
只要是把触发、调用权交给对方的,都叫回调函数。 |
13
qiayue 2019-12-20 15:46:52 +08:00
举一个真实例子,用户微信支付完成后,微信支付服务器调用你的接口,告诉你支付数据,这也叫做回调。
回头再调的意思。 |
14
enjoyCoding 2019-12-20 15:48:40 +08:00
普遍意义上我们嘴中的回调是要有异步操作的,异步操作之后触发的函数就被叫做回调函数.
|
15
sixway 2019-12-20 15:50:19 +08:00
可以说是异步操作
|
16
wangxiaoaer 2019-12-20 15:54:14 +08:00
callback = call - back = 反过来 call =反过来调用 = 回调
我觉得这个翻译听贴切的。 回到你的例子: a(b) == 你调用 a (发起者是你)然后 a 调用 b()(发起者是 a ),从发起者的角度看是反过来了。 |
17
wangyzj 2019-12-20 15:57:19 +08:00
你写的是函数指针
不是基于单线程事件的回调函数 |
18
zenxds 2019-12-20 15:59:13 +08:00
你在淘宝买了个东西,东西到了快递打电话给你去取就是回调,这是一个异步的过程,难不成你下了单就一直卡着等吗
|
19
hehheh 2019-12-20 15:59:46 +08:00
上过微机原理的课肯定听说过 interrupt,虽然不是一码事,可是是一个道理
|
20
1KN6sAqR0a57no6s 2019-12-20 16:12:58 +08:00 1
1、“回调函数,是当父函数执行完后再去执行传入的函数。” 这句话是错误的,父函数并不是呆呆地执行每一个以参数形式传进来的回调函数,它有可能在适当的时机调用,也可能永远不调用。2、回调函数本质上是“面向未来编程”,当我开始做一件事的时候(父函数),有些伴生的事明明还没有发生(事件、条件),我已经想好了应对这些可能事件的方法(回调函数)。3、“面向未来编程”的通俗名字是异步编程,用回调函数的形式写代码只是异步编程的一种模板,你也可以用“监听事件 /触发事件”这样的模板来进行异步编程。
|
21
chairuosen 2019-12-20 16:28:17 +08:00 1
现在调用么?
不,等我先弄别的,回头再调你 |
22
lllllliu 2019-12-20 16:53:17 +08:00
一切不考虑上下文的回调都不是好回调 (狗头
|
23
feigle OP @chairuosen 最佩服这个解释啦。
1、如果是现在调用你,那么就是直接 b(x,y),就够了,没必要在外面包一层 2、如果在调用你之前,还要做点事,那么就是 a(b),在 a 里面做点事,然后在 a 中去调用 b。 |
24
mahogany 2019-12-20 17:34:33 +08:00
一件事情 A 不一定做得完,需要 B 的参与. 但是 A 傻等着 B 完成他的工作也不是个办法,干脆 B 做完之后通知 A 继续做.
这里需要从'单个逻辑控制流'的看法转变成 '多组件协作',当然这主要说的是异步回调. |
25
bigggge 2019-12-20 18:24:04 +08:00
Don't Call Me, I'll Call You
|
26
v2student 2019-12-20 18:45:45 +08:00
结果返“回”了
再“调”用这个函数 |
27
by73 2019-12-20 18:49:35 +08:00
其实这是翻译问题。原意很清楚,就是日常用语 I'll call back later,本意也一样,就是“我稍后会去调用它”。
|
28
hoyixi 2019-12-20 18:59:24 +08:00
本质是函数作为参数传递。至于啥时候调,是立刻调,还是稍后调, 随你的便。 所以翻译或者强调成回调函数,纯属脱裤子放屁,唯恐不够复杂。
至于“稍后调”的场景,最好理解的是事件处理( event handler ),先定义好事件处理函数,事件一发生就调用。 如果你学到了 DOM,就非常容易理解了。 |
29
ljpCN 2019-12-20 19:00:31 +08:00 via Android
"把函数给我,我回头执行的时候得调用一下"
|
30
ethego 2019-12-20 19:20:37 +08:00
在完全并行化的 V8 里,曾经有很长一段时间回调是唯一控制两个函数顺序执行的方法,然后后来我们有了 future promise,以及 async await 这样更好的并发语义。
|
31
Arrowing 2019-12-20 21:26:56 +08:00
习惯性的理解吧,等于说完成了一件事,要告诉调用者,我已经完成了。
原因是,js 里,是一个 Event Loop 模型,异步处理的任务,不会阻塞同步任务,异步处理完了,会将任务丢到正常的执行队列里,此刻一般会使用回调方法来通知。 |
32
dangyuluo 2019-12-21 05:32:13 +08:00
你这个例子不能完美体现“回调”二字,换个想法
``` element.onClick(doSomething) ``` |
33
crella 2019-12-21 11:54:23 +08:00
不懂就问,这个和 函数 的 反射 有什么不同?
|
34
crella 2019-12-21 12:04:08 +08:00
|
35
dlqingxi 2019-12-22 16:11:38 +08:00
我给你写一段代码感受一下回调函数。
var fun1 = function(){//具有某种功能的函数 console.log('fun1 called'); } var fun2 = function(){//具有某种功能的函数 console.log('fun2 called); } class Something { callbackFun;//回调函数,注意这里是空,它在某个时机会被调用。现在也不知道到时候具体调哪个函数 ctor(){ } setCallback(callback, thisObj, myArgs){//合适的时候设置 回调函数 this.callbackFun = callback.bind(thisObj, myArgs); } doCallback(){//真正执行回调函数 this.callbackFun && this.callbackFun(); } } 回调回调,回来再调。 做完了某个事情后,应该调用某个函数。 此为由来。 |