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 条回复
chairuosen
2019-12-20 16:28:17 +08:00
现在调用么?
不,等我先弄别的,回头再调你
lllllliu
2019-12-20 16:53:17 +08:00
一切不考虑上下文的回调都不是好回调 (狗头
feigle
2019-12-20 16:53:35 +08:00
@chairuosen 最佩服这个解释啦。
1、如果是现在调用你,那么就是直接 b(x,y),就够了,没必要在外面包一层
2、如果在调用你之前,还要做点事,那么就是 a(b),在 a 里面做点事,然后在 a 中去调用 b。
mahogany
2019-12-20 17:34:33 +08:00
一件事情 A 不一定做得完,需要 B 的参与. 但是 A 傻等着 B 完成他的工作也不是个办法,干脆 B 做完之后通知 A 继续做.
这里需要从'单个逻辑控制流'的看法转变成 '多组件协作',当然这主要说的是异步回调.
bigggge
2019-12-20 18:24:04 +08:00
Don't Call Me, I'll Call You
v2student
2019-12-20 18:45:45 +08:00
结果返“回”了
再“调”用这个函数
by73
2019-12-20 18:49:35 +08:00
其实这是翻译问题。原意很清楚,就是日常用语 I'll call back later,本意也一样,就是“我稍后会去调用它”。
hoyixi
2019-12-20 18:59:24 +08:00
本质是函数作为参数传递。至于啥时候调,是立刻调,还是稍后调, 随你的便。 所以翻译或者强调成回调函数,纯属脱裤子放屁,唯恐不够复杂。

至于“稍后调”的场景,最好理解的是事件处理( event handler ),先定义好事件处理函数,事件一发生就调用。 如果你学到了 DOM,就非常容易理解了。
ljpCN
2019-12-20 19:00:31 +08:00
"把函数给我,我回头执行的时候得调用一下"
ethego
2019-12-20 19:20:37 +08:00
在完全并行化的 V8 里,曾经有很长一段时间回调是唯一控制两个函数顺序执行的方法,然后后来我们有了 future promise,以及 async await 这样更好的并发语义。
Arrowing
2019-12-20 21:26:56 +08:00
习惯性的理解吧,等于说完成了一件事,要告诉调用者,我已经完成了。
原因是,js 里,是一个 Event Loop 模型,异步处理的任务,不会阻塞同步任务,异步处理完了,会将任务丢到正常的执行队列里,此刻一般会使用回调方法来通知。
dangyuluo
2019-12-21 05:32:13 +08:00
你这个例子不能完美体现“回调”二字,换个想法

```
element.onClick(doSomething)
```
crella
2019-12-21 11:54:23 +08:00
不懂就问,这个和 函数 的 反射 有什么不同?
crella
2019-12-21 12:04:08 +08:00
我暂时只能理解到这一步:

https://paste.ubuntu.com/p/df99xRKDvB/
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();
}

}

回调回调,回来再调。
做完了某个事情后,应该调用某个函数。
此为由来。

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

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

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

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

© 2021 V2EX