You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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); } });

关键修改说明

  1. 简化默认值处理:用ES6参数默认值type = "GET"替代原来的三元判断,代码更简洁易读。
  2. 移除内部的success定义:保留外部传入的回调函数,这样调用时传的alert逻辑才能生效。
  3. 正确触发回调:在请求成功的回调(onreadystatechange)里,直接调用传入的success,并把responseText作为参数传递,这就和jQuery的逻辑一致了。
  4. 优化请求细节:把请求方法转成大写,修复请求头的空格问题,改成异步请求避免阻塞主线程。

现在这个函数就和你期望的jQuery Ajax用法类似了,传入的success回调会在请求成功时被触发,并且能拿到返回的responseText。

内容的提问来源于stack exchange,提问作者C Francis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:56:15