一尘不染

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

ajax

我从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.foo。我如何在XMLHttpRequest事件中保留对主对象的引用?


阅读 177

收藏
2020-07-26

共1个答案

一尘不染

最简单的方法通常是将的值存储在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),这只是对构造函数的引用。

也许是这个问题的主题,但建议阅读:

2020-07-26