对象内的 XMLHttpRequest:如何保留对“this”的引用

2023-11-22

我从 javascript 对象内部进行一些 Ajax 调用:

myObject.prototye = {
  ajax: function() {
    this.foo = 1;

    var req = new XMLHttpRequest();
    req.open('GET', url, true);
    req.onreadystatechange = function (aEvt) {  
      if (req.readyState == 4) {  
        if(req.status == 200)  {
          alert(this.foo); // reference to this is lost
        }
      }
  }
};

在 onreadystatechange 函数内部,this 不再引用主对象,因此我无权访问 this.foo。如何在 XMLHttpRequest 事件中保留对主对象的引用?


最简单的方法通常是存储this在局部变量上:

myObject.prototype = {
  ajax: function (url) { // (url argument missing ?)
    var instance = this; // <-- store reference to the `this` value
    this.foo = 1;

    var req = new XMLHttpRequest();
    req.open('GET', url, true);
    req.onreadystatechange = function (aEvt) {  
      if (req.readyState == 4) {  
        if (req.status == 200)  {
          alert(instance.foo); // <-- use the reference
        }
      }
    };
  }
};

我还怀疑你的myObject标识符实际上是一个构造函数(您正在分配一个prototype财产)。

如果是这种情况,请不要忘记添加正确的constructor属性(因为您要替换整个prototype),这只是对构造函数的引用。

可能与这个问题无关,但建议阅读:

  • 构造函数被认为有点令人困惑
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象内的 XMLHttpRequest:如何保留对“this”的引用 的相关文章

随机推荐

  • 是什么导致异常中的递归原因?

    当在调试器中查看 Java 中的异常时 您经常会发现原因是无限递归的 我假设它是无限的 e g Exception1 Caused by gt Exception2 Caused by gt Exception2 Caused by gt
  • linux如何用同一个驱动程序驱动多个网卡?

    我最近在学习linux网络驱动 我想知道如果我的板上有很多相同类型的网卡 内核如何驱动它们 内核是否需要多次加载同一个驱动程序 我认为这是不可能的 insmod不会这样做 那么我怎样才能让所有同类卡同时工作呢 regards 每张卡的状态
  • 只显示 ng-repeat 的第一个元素

    如何仅显示角度中的第一个元素 我在用着ng repeat像这样 div div product price div div 但既然我不重复 那么我不必使用ng repeat 我怎样才能让它只显示第一个 而不必进入 ng repeat 您可能
  • 从 SQL Server 数据库获取“下一个”行并在单个事务中对其进行标记

    我有一个用作队列的 SQL Server 表 它正在由多线程 很快将成为多服务器 应用程序进行处理 我想要一种方法让进程从队列中声明下一行 将其标记为 进程中 而多个线程 或多个服务器 不可能同时声明同一行 有没有办法更新一行中的标志并同时
  • 让 CMake 为 MSVC 构建共享库 [重复]

    这个问题在这里已经有答案了 我一直在使用 CMake 在 Unix 环境中构建 C 和 C 项目 但是 我也想开始在 MSVC 中进行编译 并且我试图了解 cmake 文档 但我遇到了困难 当我尝试构建时 我不断收到以下消息 链接 致命错误
  • 将特定于页面的 Javascript 添加到 CakePHP 中的每个视图

    为了使我的脚本保持可维护性 我将把每个脚本移到自己的文件中 按控制器和操作组织 scripts which only apply to views posts add ctp app webroot js page posts add js
  • 如何让 Ansible 解释变量内的变量?

    每当我尝试让 Ansible 解释嵌套变量 即另一个变量中的变量 时 我都无法获得预期的结果 给定变量 key bar foo bar baz foo bar baz 我尝试过这三种方法 但动态访问密钥的运气不佳bar字典的foo或钥匙fo
  • QueryDSL 窗口函数

    如何使用窗口函数编写查询并选择 QueryDSL 中的所有字段 在文档中有一个这样的例子 query from employee list SQLExpressions rowNumber over partitionBy employee
  • 电子邮件:[Firebase] 客户端对 Cloud Firestore 数据库的访问权限将在 X 天后到期

    我收到一封电子邮件 表明我正在 测试模式 下进行开发 但它使我的数据库完全向互联网开放 我最初接受的默认规则如下所示 rules version 2 service cloud firestore match databases datab
  • Android 位图共享意图 - 是否可以在共享之前不保存它?

    我尝试使用共享意图从我的应用程序导出位图 而不保存临时位置的文件 我找到的所有例子都是两步的 1 保存到SD卡并为该文件创建Uri 2 用这个Uri开始意图 是否可以在不需要 WRITE EXTERNAL STORAGE 权限的情况下保存文
  • CListCtrl:如何保持滚动位置?

    我有一个 CListCtrl 报告样式 我可以在其中清除列表并在某些时间重新填充它 我想在执行此操作时保持垂直滚动位置 我发现有几种看起来很有前途的方法 EnsureVisible GetScrollPos SetScrollPos Get
  • 如何从预处理器宏中识别平台/编译器?

    我正在编写一个跨平台代码 它应该在linux windows Mac OS 上编译 在windows上 我必须支持visual studio和mingw 有一些特定于平台的代码 我应该将其放入 ifdef endif环境 比如这里我放置了w
  • 使用 Azure DevOps 管道的 AzureFileCopy 失败 - “AzCopy.exe 以非零退出退出

    我尝试将 ARM 模板复制到存储但失败 YML 可能出现什么问题 ERROR AzCopy AzCopy exe logout INFO Logout succeeded INFO AzCopy exe A newer version 10
  • 如何解决“资源”参数中的“重复项目”错误

    在处理我的项目时 我遇到了以下错误 在 资源 参数中多次指定了 项 资源 参数不支持重复项目 删除了项目名称 没关系 但是 我不知道如何解决这个问题 在 Visual C Express 中哪里可以找到此参数 我猜 项是一种形式 那么 从最
  • 替换部分超链接

    我需要修改 xls 工作簿中的大量超链接 我的链接是这样的 mysrv001 some path documents doc我需要更换 mysrv001 with mysrv002 我尝试了类似的操作 但收到错误 对象不支持此属性或方法 我
  • 如何使用 Python 图像库 (PIL) 识别非照片或“无趣”图像

    我有数千张图像 我需要剔除那些不是照片或其他 有趣 的图像 例如 无趣 的图像可能全部是一种颜色 或者大部分是一种颜色 或者是简单的图标 徽标 该解决方案不必是完美的 只要足以删除最不有趣的图像即可 到目前为止 我最好的想法是对像素进行随机
  • 匹配多种类型以实现模板专业化解析

    简单地忽略一个事实 即正常的函数重载将更好地服务于这个示例 它只是作为学习模板编程的一种方式 话虽如此 欢迎您评论与函数模板专业化相比 使用函数重载所获得的好处 差异 尽管这可能值得一个自己的问题 考虑以下示例 template
  • 使用 HTML Agility Pack 和 Linq 解析 html

    我有以下 HTML tbody tr td class name Test1 td td class data Data td td class data2 Data 2 td tr tr td class name Test2 td td
  • 使 Console.WriteLine() 换行单词而不是字母

    Using Console WriteLine 它输出 我希望它自动看起来像这样 而不是手动输入 n任何需要的地方 这可能吗 如果是这样 怎么办 这是一个适用于制表符 换行符和其他空格的解决方案 using System using Sys
  • 对象内的 XMLHttpRequest:如何保留对“this”的引用

    我从 javascript 对象内部进行一些 Ajax 调用 myObject prototye ajax function this foo 1 var req new XMLHttpRequest req open GET url tr