概念
指一个函数(A)并作为另一个函数(B)的参数并进行使用,函数A就是回调函数。根据执行的顺序不同将回调函数分为同步回调以及异步回调。
同步回调
是指回调函数 的执行是同步的,比如数组api里的sort、forEach、filter之类的
let arr = [1, 2, 3];arr.filter(function (num) {console.log(num);});console.log('会在filter之后执行');//1 2 3 '会在filter之后执行'
传入filter里的匿名函数就是同步回调。因为回调函数的 执行是由filter来调用的,并且是同步执行。
自定义同步回调
function B(fnA){console.log("b函数的代码");//执行函数AfnA();}B(function(){console.log("a函数的代码");})console.log('函数调用之后的代码')
异步回调
是指某回调函数不会按照顺序执行,我们称这样的回调函数为异步回调。
理解:
- 如果不能直接拿到结果, 那就是异步。
举例:
- 比如你在餐厅门口等位,你拿到号可以去逛街
- 什么时候才能真正吃饭呢?
- 你可以每10分钟去餐厅问一下(这个就像是轮询)
- 你也可以扫码用微信接收通知(这个就像回调)
在程序中,异步回调会在某个时间点自动触发或通过动作来触发,在等待期间其他代码会执行。
常见的异步回调:
- 定时器
- Ajax
-
同步回调和异步回调的区别
执行顺序不同。同步回调执行之后才会执行后续的代码。异步回调不阻碍其他的代码执行。
变量的访问问题:如果在同步回调中对变量进行操作,在同步回调执行后是可以拿到变量最新的数据。而异步回调则不保证,如果在异步回调中进行赋值,并在异步回调外使用,可能变量拿到的数据没有更新(因为异步回调有可能还没执行)
练习
有三个函数, 需要实现函数A调用之后会立即调用B,函数C调用之后会立即调用函数A
function fna (fn) {console.log('a');if (fn) {fn()}}function fnb () {console.log('b');}function fnc (fn) {console.log('c');if (fn) {fn()}}fna(fnb)fnc(fna)//a b c a
如何实现多个div的按照顺序依次淡入的效果
点击查看【codepen】
