qq_38930217 2018-10-25 12:43 采纳率: 25%
浏览 532
已结题

关于回调函数的问题,请大佬们解答下,谢谢

今天百度了一天回调函数的内容,知道了回调函数实际上是将整个函数以一个参数的形式传递给另一个参数,但是在用Jquery的ajax时一直搞不明白,我们执行完一个url后会返回数据data,然后success(data)会再进一步处理数据,success就是回调函数了,但完全搞不懂为什么这个回调函数是在主体函数执行完才结束的,难道说主体函数结束的最后一句语句就是调用这个回调函数吗?还是说js有自己的机制,检测到是回调函数就会用浏览器的异步形式去处理,再放到队列中等到主体函数执行完再放进栈中处理?求教大神帮忙解答一下,困惑了一天。

  • 写回答

2条回答 默认 最新

  • 天际的海浪 2018-10-25 14:21
    关注

    如果你看了原生的ajax代码就会明白

    function getData(url,success) {
        //步骤一:创建XMLHttpRequest对象
        var ajax = new XMLHttpRequest();
        //步骤二:设置请求的url,这里true是异步方式请求
        ajax.open('get',url,true);
        //步骤三:发送请求
        ajax.send();
        //步骤四:注册事件 onreadystatechange 当请求状态改变时触发
        ajax.onreadystatechange = function () {
            if (ajax.readyState==4 && ajax.status==200) {
                //步骤五 如果能够进到这个判断 说明数据取回来了
                success(ajax.responseText);//调用回调函数并传递数据
            }
        }
    }
    
    getData("xxxx.php",function (data) {
        console.log(data);
    })
    

    代码先是创建一个XMLHttpRequest对象,并用ajax.open('get',url,true);ajax.send()设置和发送请求。
    但是这个请求是异步的,代码不会在这里等待这个请求完成,而是继续执行之后的代码。
    那么怎么知道这个请求完成了呢?
    这就要为XMLHttpRequest对象注册事件 onreadystatechange ,当请求状态改变时就会触发这个事件,
    当ajax.readyState==4 && ajax.status==200时,就说明请求的数据完成了,这时就可以调用success()回调函数。

    这其实与 window.onload 事件在页面加载完成时执行是一个意思。

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。
  • ¥30 win c++ socket
  • ¥15 C# datagridview 栏位进度