要知道回调函数是啥,首先要知道,回调函数是用来干嘛的:
回调函数是用来取一个异步操作的函数里的值的,也就是说:如果一个函数是异步的,这个函数不知道什么时候才能完成,也就拿不到这个函数里的值。
其中一个解决方法就是在这个异步函数中再放一个函数,当这个异步函数完成后执行,这个安插在异步函数里的函数被调用,将参数传出也就能打印出异步操作的结果了。
其他解决方法有如promise,await等操作,这里不讨论
那么具体怎么取呢,看代码:
1 function pre(callback){
2 var a="a"
3 callback(a)
4 console.log(1)
5 }
6
7 pre(function(b){
8 console.log(b)
9 console.log(2)
10 })
执行结果:
首先我们可以从打印结果中清楚的看见,代码的执行顺序。
其次再看,声明pre()函数时有一个参数,这个参数是一个函数名,在执行pre函数时,传入了一个实打实的函数:
function(b){
console.log(b)
}
这是啥意思呢,也就是说这个匿名函数被传进去后callback函数被赋值,此时两个函数的内存地址一致:
//伪代码
callback(a) = function(b){
console.log(b)
console.log(2)
}
上面的代码没有异步操作,那模拟一下异步操作,也是一样的:
function pre(callback){
setTimeout(function(){
var a="a"
callback(a)
},1000)
}
pre(function(b){
console.log(b)
console.log(2)
})
一样可以得到,没有问题
而我们一般在写接口、发送ajax请求,亦或是操作数据库时最常见到回调函数:API让我们传入一个回调函数。
//node.js中操作mongodb
db.collection("user").insertOne({a:"a"}, (err, result)=>{
if(err){
return
}
})
这段代码就相当于第一段代码的7.8.9.10行代码
就像上面简单的数据库插入操作,第一个参数是要插入的数据,第二个参数就是一个回调函数(数据库与网络请求操作都是异步的,所以需要用回调函数)
给API传入一个函数,然后API就像第一段代码的1.2.3.4.5行,将参数给到err,result。当然了,API内部函数复杂得多,API就像一个看不见的黑盒子,代码在里面不断运转,最终将完成功能并将信息放在你传入的函数的参数里(err,result)