Javascript 使用';这';

Javascript 使用';这';,javascript,object,Javascript,Object,我代码的一部分 var tablo = { tablo_id: 0, retrivedData: 1234, getData: function() { var xhr; var data = "aranan=" + document.getElementById('aranan').value; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest();

我代码的一部分

var tablo = {
    tablo_id: 0,
    retrivedData: 1234,
    getData: function() {
      var xhr;
      var data = "aranan=" + document.getElementById('aranan').value;

      if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
      } else if (window.ActiveXObject) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");

        xhr.onreadystatechange = function() {
          if (xhr.readyState == 4 && xhr.status == 200) {
            this.retrivedData = JSON.parse(xhr.responseText);
            console.log(this.retrivedData); //first
          }
        }

        xhr.open("POST", "listele.php", true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(data);
      },

      setData: function() {
        console.log(this.retrivedData); //Second  
      }
    }
}
function u() {
  tablo.getData();
  tablo.setData();
}

当我运行函数u()时,first console.log work但seconde one不起作用,second只返回1234。我使用button onclick event中的函数u()来保留“this”范围,在定义
xhr.onreadystatechange=…
之前,您应该保存对
this
var\u this=this
)的引用,并将其用于回调,而不是
this
,该行为是由事实引起的,回调中的
不指向对象,而是指向
窗口
。因此,本质上,您设置的是
window.retrievedData
,而不是对象的
retrievedData
。要解决该问题,您有以下选项:

1) 使用以下方法将正确的
绑定到回调:

xhr.onreadystatechange = function() {
    // [...]
}.bind(this)
var self = this;
xhr.onreadystatechange = function() {
    // here do not use "this" but "self" instead
}
2) 使用以下方法手动设置

xhr.onreadystatechange = function() {
    // [...]
}.bind(this)
var self = this;
xhr.onreadystatechange = function() {
    // here do not use "this" but "self" instead
}
3) 使用ES6的胖箭头表示法:

xhr.onreadystatechange = () => {
    // [...]
}
但是请注意,大多数浏览器还不(完全)支持ES6。例如,您需要使用Babel传输代码


也不是说它是“检索”而不是“检索”的。

这是因为,您正在发送异步AJAX请求,在javascript中,默认情况下,所有AJAX请求都是异步的。异步请求不会等待响应,它将发送AJAX请求并继续调用(这确实是一个特性),因为在服务器响应的同时,您可以在javascript上执行其他代码

所以你们的实际执行顺序是 函数getData()->发送请求->函数setData()->控制台.log(“第二个”)->接收响应->控制台.log(“第一个”)

您可以尝试下面的代码,让我知道它是否解决了您的问题

var tablo = {
    tablo_id: 0,
    retrivedData: 1234,
    getData: function() {
      var xhr;
      var data = "aranan=" + document.getElementById('aranan').value;
      var that = this;
      if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
      } else if (window.ActiveXObject) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
        xhr.onreadystatechange = function() {
          if (xhr.readyState == 4 && xhr.status == 200) {
            that.retrivedData = JSON.parse(xhr.responseText);
            console.log("First :",that.retrivedData); //first
            that.setData();
          }

        }

        xhr.open("POST", "listele.php", true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(data);

      },

      setData: function() {
          console.log("Second :",this.retrivedData); //Second  
        },

    }
}

function u() {
  tablo.getData();
  //tablo.setData();
}

您需要定义“工作”和“不工作”的含义。提供预期输出和实际输出,以及任何错误消息(如果有)。那么如何更改此设置situation@GungorCelik:这取决于你想要实现什么,你能更清楚地回答你的问题吗,然后我可以帮助你们…我只是将数据从getData函数传输到SetData函数,该函数有填充表格单元格的代码loop@GungorCelik:好的,那么您需要在收到响应后调用该函数,所以在readystate更改时,您可以调用回调函数。我理解,但我不知道如何执行该操作