4
(function (send) {

     XMLHttpRequest.prototype.send = function () {

         console.log(this.onreadystatechange); //null
         send.apply(this, arguments);
     };

})(XMLHttpRequest.prototype.send);

为什么为this.onreadystatechange空?据此,应该存在并且是 type function

4

2 回答 2

9

onreadystatechange 确实存在...这就是为什么它是null。如果它不存在,它将是undefined。这一切都取决于它是否已经设置。它显然已经是一个属性,因为它是null……如果不是,它将是undefined……或者至少"onreadystatechange" in thisfalse

这是一个例子:

var a = new XMLHttpRequest();
a.onreadystatechange = function () {
};
a.send();

您的控制台将记录一个function.

如果你有:

var b = new XMLHttpRequest();
b.send();

您的控制台将记录null.

这是发生这种情况的演示:http: //jsfiddle.net/3XKx7/

(我清楚地省略了发送 AJAX 请求的其他步骤,这只是为了解释)

我并不是要暗示nulland之间存在关系undefined-我只是说在创建 new 时XMLHttpRequestonreadystatechange将在null内部设置为。是否将其设置为功能取决于您。

更新

创建/发送 XHR 的正常方式是以下顺序:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {    // This and `open` could be flip-flopped
    // whatever
};
xhr.open("POST", url, true);
xhr.send("data=data");

我总是被告知/显示要创建新的,然后是设置和调用XMLHttpRequest的任何顺序,但只有在这两个之后我才应该调用。onreadystatechangeopensend

因此,如果始终这样做,onreadystatechange(如果实际设置)将不会null并且将是function.

既然您提到您使用的是 jQuery,我决定测试覆盖send您想要的方法,并进行 jQuery$.ajax调用(而不是XMLHttpRequest手动发送)。这是我的测试 - http://jsfiddle.net/3XKx7/1/

为什么onreadystatechange会这样是没有意义的null,因为 jQuery必须绑定到该事件才能知道请求何时完成及其状态。所以我决定看一下jQuery源代码。我发现他们称事物的顺序是:

xhr.open()
xhr.send()
xhr.onreadystatechange = function () {

};

这意味着当您覆盖该send方法时,onreadystatechangenull因为 jQuery调用send. 我不知道他们这样做的原因......这可能是为了防止像你正在做的事情......但我从未听说或看到使用这种约定。

所以你得到它的价值的原因null是因为 jQueryonreadystatechange 调用send. 这意味着当您覆盖send并尝试访问该onreadystatechange属性时,它尚未设置。

希望这是一个可以帮助您理解的示例:http: //jsfiddle.net/dMP6q/16/

于 2013-04-05T13:59:36.980 回答
1

你应该自己设置它,当状态改变时会调用这个函数。它就像其他事件处理程序一样,如document.onload,yourelement.onclick等。

经典地你做

    var httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function() {
        if (httpRequest.readyState === 4) {
              if (httpRequest.status === 200) {
                  // use httpRequest.responseText
              }
        }
    };
    httpRequest.open('GET', url);
    httpRequest.send();
于 2013-04-05T13:49:37.717 回答