关于js的callback回调函数以及嵌套回调函数的执行过程理解

回调函数的处理逻辑理解:
所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面。
待回调函数被触发调用的时候,对应的回调函数的代码才会从管理器队列取出来并自动执行(激活回调函数的代码),实现异步的编程效果


关于回调函数的另外一个更加形象的说法:
回调函数一个实例:儿子去做一个事情,完成之后父亲会给一个红包(给儿子)。然后父亲立刻去忙别的事情了。
分析例子:
首先,事情必须要完成之后才可以给红包。另外,红包的钱是父亲给,儿子只需要在完成之后,自己拆开红包即可。当然,儿子并不用知道父亲会给多少钱。
很简单吧?其实回调函数也就是这样子的思路。
儿子去做一个事情–>调用儿子的做事情的函数方法。儿子的函数方法是异步的,并不会影响下一步动作:父亲工作。
红包–>回调函数,也就是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.工作();

现在问题来了,对于嵌套的回调函数应该如何理解呢?
对于一些必须要等回调函数执行完毕才可以确定的动作,实际上,就是会掉入一个层层回调的局面了。这点也是回调函数的复杂的地方!也就是所谓的嵌套回调函数。
换句话说,只要您要获取的值是要被回调才确定的,那接下来的所有代码都必须用回调的方式来编写,层层嵌套。
以百度提问的一个例子简单说明:
问题:
js 回调函数问题的执行结果想作为返回值
 

function receive()
{
    var re_data;
    client.on('data', function(data) {
        re_data = data;
        console.log(data);
        client.end(); 
    });
    return re_data ;
}

receive这个函数的目的是返回接受到的数据(data),但data值在一个回调函数里面,总是先执行return ,再执行回调函数,因此返回值总是undefined,有什么办法可以解决吗?
解决办法:
建议改变你的思维方式,将你的函数 receive 也改成回调式的

function receive(callback){
    // ....
    client.on('data', function(data) {
        callback(data);
    });
}

然后,别的地方要调用receive函数,则将这个函数获取的值之后的所有动作都封装在回调函数callback里面。
例如:

aaaa;
receive(function(data){
    //这里下面的代码都可以获取data了。
    data....的处理。。。
});

可以看出,嵌套的回调函数的执行顺序是逆向逐步执行。

现在让我们理解一下所谓的嵌套的异步回调函数:
主函数的代码实际上还是按照顺序执行的。
只要是封装在回调函数里面的代码,都是要等待最深层的回调函数执行之后,才会逐一执行前一层的回调函数的代码!
另外一个理解:我不需要知道你是怎么做的,你只需要做好之后告诉我,并且告诉我结果,即可。我只要结果!
如果是要等到知道结果才可以继续做的事情,则就是要写在等待别人告诉我之后才可以做的事情列表里面(回调函数的事情);
如果是别的事情,例如上班什么的,立刻就去做,无需等待!

总结:

所谓的回调函数,就是由调用函数提供执行代码,被调用函数执行完毕之后,再自动执行的一个函数。异步式。
如果是嵌套的回调函数,就是,调用函数的回调函数嵌入到被调用函数所运行的回调函数代码之间(执行)的函数。就是callback代码中的callback函数。嵌套回调!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值