今天百度了一天回调函数的内容,知道了回调函数实际上是将整个函数以一个参数的形式传递给另一个参数,但是在用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 事件在页面加载完成时执行是一个意思。
解决 无用评论 打赏 举报
悬赏问题
- ¥40 复杂的限制性的商函数处理
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码