个人理解回调:
functionA是主函数,functionB是回调函数,在主函数A中调用B,主函数A先执行,等执行完了执行回调函数B。外部函数不用等待A执行完就可以接着执行以后的命令。
1、引用博客:
我们先来看看回调的英文定义:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed。
字面上的理解,回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。
其实也很好理解对吧,回调,回调,就是回头调用的意思。主函数的事先干完,回头再调用传进来的那个函数。但是以前看过很多博客,他们总是将回调函数解释的云里雾里,很高深的样子。
举一个别人举过的例子:约会结束后你送你女朋友回家,离别时,你肯定会说:“到家了给我发条信息,我很担心你。” 对不,然后你女朋友回家以后还真给你发了条信息。小伙子,你有戏了。其实这就是一个回调的过程。你留了个参数函数(要求女朋友给你发条信息)给你女朋友,然后你女朋友回家,回家的动作是主函数。她必须先回到家以后,主函数执行完了,再执行传进去的函数,然后你就收到一条信息了。
现在基本理解回调函数的意思了吧。不理解的话没关系,我们用代码说话。
//定义主函数,回调函数作为参数
function A(callback) {
callback();
console.log('我是主函数');
}
//定义回调函数
function B(){
setTimeout("console.log('我是回调函数')", 3000);//模仿耗时操作
}
//调用主函数,将函数B传进去
A(B);
//输出结果
我是主函数
我是回调函数
上面的代码中,我们先定义了主函数和回调函数,然后再去调用主函数,将回调函数传进去。
定义主函数的时候,我们让代码先去执行callback()回调函数,但输出结果却是后输出回调函数的内容。这就说明了主函数不用等待回调函数执行完,可以接着执行自己的代码。所以一般回调函数都用在耗时操作上面。比如ajax请求,比如处理文件等。
2、源自http://blog.csdn.net/samt007/article/details/54647361
回调函数的处理逻辑理解:
所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面。
待回调函数被触发调用的时候,对应的回调函数的代码才会从管理器队列取出来并自动执行(激活回调函数的代码),实现异步的编程效果。
关于回调函数的另外一个更加形象的说法:
回调函数一个实例:儿子去做一个事情,完成之后父亲会给一个红包(给儿子)。然后父亲
立刻去忙别的事情了。
分析例子:
首先,事情必须要完成之后才可以给红包。另外,红包的钱是父亲给,儿子只需要在完成之后,自己拆开红包即可。当然,儿子并不用知道父亲会给多少钱。
很简单吧?其实回调函数也就是这样子的思路。
儿子去做一个事情–>调用儿子的做事情的函数方法。儿子的函数方法是异步的,并不会影响下一步动作:父亲工作。
红包–>回调函数,也就是callback(通常是匿名函数)。儿子只需要确定拆开它(执行它)即可。至于里面是什么,有多少钱,儿子管不了。
红包里面的钱–>可以理解为回调函数所执行的代码段。由调用者提供!决定给多少钱。
儿子完成之后才可以拆红包–>儿子的工作函数完成之后,才会调用所提供的回调函数(也就是拆红包,数钱)。
//父亲对象定义:
var father={
pay:function(money){
account.pay(money);//父亲账户付款
},
工作:function(){xxxxxx}
}
//儿子对象定义:
var son={
work:function(callback){//儿子的工作函数
//辛辛苦苦的干活
working();
//活干完之后,执行回调函数(拆红包)
callback;
},
receive:function(money){
account.rec(money);//儿子账户收款
}
}
//现实生活对应程序:
//儿子去做一个事情。完成之后父亲会给一个红包(给儿子)。然后父亲立刻去工作了。
son.work(function(){
var money=200;
father.pay(money);//父亲付款200元
son.receive(money);//儿子收款200元
});
//父亲继续做别的事情
father.工作();
还有嵌套回调,没有看了。。。有需要的时候再看。