这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
前言
js中存在一种情景,就是异步操作,假如有事件a,事件b,事件c三个事件,执行顺序必须是a,b,c,那么我们就要在分别写三个函数来执行这三个事件,及先执行函数a,在a中再调用b,在b中再调用c,但是这样的做法很low,还会多出来一些没用的参数,这时候我们就可以用回调函数来解决这个问题,那什么是回调函数呢,我们下面来一一讲解。
回调函数
回调函数的定义
回调函数就是一个函数a作为实参传入另一个函数b,并在b中执行a这个函数,这就是回调函数,代码形式如下
function b(callback){
console.log('我是b的打印')
callback()
}
b(function(){
console.log('我是a的打印')
})
//执行结果是:我是b的打印 我是a的打印
复制代码
如上代码,function(){console.log(‘我是a的打印’)},这个函数就是一个回调函数
回调函数的使用
大家一定都用过ajax吧,ajax请求的参数列表中有一个success:function(data){}函数,我们可以在这个函数中拿到请求回来的数据data,其实这就也是一个回调函数,只是封装在了ajax底层,我们看不到,下面用普通的代码来演示一遍这个逻辑
//这里的定时器模拟接口请求后台数据
function b(callback){
setTimeout(function(){
var data = '我是请求回来的数据'
callback(data)
},2000)
}
//这里的success函数就相当于ajax中的success函数
let success = function(data){
console.log(data)
}
b(success)
//运行的结果是 我是请求回来的数据
复制代码
相信到这里你应该对回调函数有了进一步的认识,下面我们来解决开头抛出的问题,代码如下
//下面代码中的定时器模拟接口请求后台数据的操作
//a事件执行
function a(callback){
setTimeout(function(){
console.log('a事件执行完毕了')
callback && callback() //如果传入的有回调函数就执行,如果没传就不执行,没传的话这里是undefined
},5000)
}
//c事件执行
function c(){
console.log('c事件执行完毕了')
}
//b事件执行
a(function(){
setTimeout(function(){
console.log('b事件执行完毕了')
c()
},2000)
})
//运行结果是 a事件执行完毕了,b事件执行完毕了,c事件执行完毕了
复制代码
由上代码可以看出,我们使用回调函数可以轻松的解决开头提出的问题,并且我们把b当做回调函数传入a函数的调用,这样还减少了b函数的声明。
总结
本文主要是想说明到底什么是回调函数以及回调函数到底有什么用,还有如何用回调函数,但日常的工作中回调函数也不宜多用,如果非常多层的使用回调函数,那么就会产生回调地狱,以后改起来代码会非常麻烦,因此,我们下篇文章就来讲讲怎么解决回调地狱的问题。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END