如何在JavaScript函数内将函数作为对象属性使用?仿jQuery Ajax遇阻
解决你的自定义Ajax函数回调问题
嘿,我帮你排查出代码里的几个关键问题,正是它们导致success回调无法拿到responseText:
核心错误点
- 你覆盖了传入的success回调:在
myAjax函数内部,你重新定义了function success(suc) {},这直接把调用时传入的回调函数给覆盖了,等于外部传的alert逻辑被你这个空函数替换了,自然不会执行。 - 回调调用时机错误:你把responseText存到了
suc变量,但没有在请求成功的第一时间调用传入的success,反而等到请求结束后才处理,而且因为覆盖了回调,就算拿到数据也传不出去。 - 小细节问题:
Content-type头后面多了个空格,可能导致请求头格式不合法;另外你用了同步请求(open第三个参数false),这会阻塞主线程,现代开发不推荐。
修正后的代码
function myAjax({ type = "GET", url, success }) { var req = new XMLHttpRequest(); req.onreadystatechange = function() { // 当请求完成且成功时 if (this.readyState === 4 && this.status === 200) { // 先判断success是否是函数,避免传入非函数导致报错 if (typeof success === 'function') { // 直接把responseText传给回调函数 success(this.responseText); } } }; // 把请求方法转成大写,避免大小写问题;改成异步请求(true) req.open(type.toUpperCase(), url, true); // 修复Content-Type的空格问题 req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); req.send("fname=chijioke&lname=francis"); } // 调用测试,现在success能拿到responseText了 myAjax({ type: "post", url: "page.html", success: function(e) { alert(e); } });
关键修改说明
- 简化默认值处理:用ES6参数默认值
type = "GET"替代原来的三元判断,代码更简洁易读。 - 移除内部的success定义:保留外部传入的回调函数,这样调用时传的alert逻辑才能生效。
- 正确触发回调:在请求成功的回调(
onreadystatechange)里,直接调用传入的success,并把responseText作为参数传递,这就和jQuery的逻辑一致了。 - 优化请求细节:把请求方法转成大写,修复请求头的空格问题,改成异步请求避免阻塞主线程。
现在这个函数就和你期望的jQuery Ajax用法类似了,传入的success回调会在请求成功时被触发,并且能拿到返回的responseText。
内容的提问来源于stack exchange,提问作者C Francis
相关产品推荐
相关产品推荐

