在XMLHttpRequest回调中使用此关键字

时间:2015-06-17 05:23:13

标签: javascript ajax

在XMLHttpRequest回调中使用关键字与变量名有什么区别?

var req = new XMLHttpRequest();
req.open("GET", encodeURI(uri), true);
req.onreadystatechange = function () {
    if (this.readyState == 4) {
        req.onreadystatechange = null; //avoid memory leaks
        if (this.status == 200) {
            var res = JSON.parse(req.responseText).d;
            console.log(res);
        }
    }
};
req.send();

我可以使用 req 代替,例如if (req.readyState == 4)吗?

2 个答案:

答案 0 :(得分:0)

默认情况下onreadystatechange处理程序没有区别this是指XMLHttpRequest对象本身。

是的,您可以使用thisreq

答案 1 :(得分:0)

我自己最近遇到过类似的问题,但我将其扩展到更一般的情况:回调中哪个上下文this解决了?

关于3种流行的回调类型: setTimeout XMLHttpRequest DOM

  • 我从第一个类型的文档中读取, setTimeout this将解析为 window 对象

  • 对于 XMLHttpRequest 情况,this将解析为XMLHttpRequest对象本身,https://stackoverflow.com/a/6542261/4730119这个链接会给你一个解释,这是我的测试,为此我GET请求 api.json 的内容是一个简单的简单对象并在控制台中成功打印,注意我使用this.responseText,而不是像使用XHR对象request.responseText教授的大多数书一样 enter image description here

  • 并且最后为 DOM ,它就像XHR一样,this将解析为添加了回调的对象

    document.querySelector('input')
    .addEventListener('input', function(e){console.log(this)});
    // will print input object