概念

指一个函数(A)并作为另一个函数(B)的参数并进行使用,函数A就是回调函数。根据执行的顺序不同将回调函数分为同步回调以及异步回调。

同步回调

是指回调函数 的执行是同步的,比如数组api里的sort、forEach、filter之类的

  1. let arr = [1, 2, 3];
  2. arr.filter(function (num) {
  3. console.log(num);
  4. });
  5. console.log('会在filter之后执行');//1 2 3 '会在filter之后执行'

传入filter里的匿名函数就是同步回调。因为回调函数的 执行是由filter来调用的,并且是同步执行。

自定义同步回调

  1. function B(fnA){
  2. console.log("b函数的代码");
  3. //执行函数A
  4. fnA();
  5. }
  6. B(function(){
  7. console.log("a函数的代码");
  8. })
  9. console.log('函数调用之后的代码')

异步回调

是指某回调函数不会按照顺序执行,我们称这样的回调函数为异步回调。
理解:

  • 如果不能直接拿到结果, 那就是异步。

举例:

  • 比如你在餐厅门口等位,你拿到号可以去逛街
  • 什么时候才能真正吃饭呢?
  • 你可以每10分钟去餐厅问一下(这个就像是轮询)
  • 你也可以扫码用微信接收通知(这个就像回调)

在程序中,异步回调会在某个时间点自动触发或通过动作来触发,在等待期间其他代码会执行。
常见的异步回调:

  • 定时器
  • Ajax
  • 事件代码

    同步回调和异步回调的区别

  • 执行顺序不同。同步回调执行之后才会执行后续的代码。异步回调不阻碍其他的代码执行。

  • 变量的访问问题:如果在同步回调中对变量进行操作,在同步回调执行后是可以拿到变量最新的数据。而异步回调则不保证,如果在异步回调中进行赋值,并在异步回调外使用,可能变量拿到的数据没有更新(因为异步回调有可能还没执行)

    练习

    有三个函数, 需要实现函数A调用之后会立即调用B,函数C调用之后会立即调用函数A

    1. function fna (fn) {
    2. console.log('a');
    3. if (fn) {
    4. fn()
    5. }
    6. }
    7. function fnb () {
    8. console.log('b');
    9. }
    10. function fnc (fn) {
    11. console.log('c');
    12. if (fn) {
    13. fn()
    14. }
    15. }
    16. fna(fnb)
    17. fnc(fna)
    18. //a b c a

    如何实现多个div的按照顺序依次淡入的效果
    点击查看【codepen】