首先看一下js中回调函数的定义:
函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。
具体在js中是这么用的
function fn(arg1, arg2, callback){
var num = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
callback(num); //传递结果
}
fn(10, 20, function(num){
console.log("Callback called! Num: " + num);
}); //结果为10和20之间的随机数
这里面的callback就是回调函数。
为什么要这么用?写成下面这样不更方便吗?
function fn(arg1, arg2){
var num = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
console.log("Callback called! Num: " + num);
}
fn(10, 20); //结果为10和20之间的随机数
如果你直接在函数a里调用的话,那么这个回调函数就被限制死了。但是使用函数做参数就有下面的好处:当你a(b)的时候函数b就成了回调函数,而你还可以a(c)这个时候,函数c就成了回调函数。如果你写成了function a(){…;b();}就失去了变量的灵活性。
不要给回调函数贴标签,回调函数就是我们刚才的一种函数作为参数的形式,在处理数据请求是,我们通常有很多种情况,成功?失败?无响应?针对各种情况我们的函数需要有一定的处理操作,但是如果我们不使用回调函数,这个处理操作就定死了,那么Ajax的使用就太缺乏灵活性了,Ajax给了回调的操作处理就可以实现不同的反馈。
f1();
f2();
上面2个函数按顺序执行,f2()需要f1()的结果才能执行,如果将f2()作为f1()的回调函数,然后给f1()中耗时的代码加上延时,就不会阻塞进程,而回调就是为了让f2()在f1()之后进行。
function f1(callback){
setTimeout(function () {
// f1的任务代码
callback();
}, 1000);