onreadystatechange
确实存在...这就是为什么它是null
。如果它不存在,它将是undefined
。这一切都取决于它是否已经设置。它显然已经是一个属性,因为它是null
……如果不是,它将是undefined
……或者至少"onreadystatechange" in this
是false
。
这是一个例子:
var a = new XMLHttpRequest();
a.onreadystatechange = function () {
};
a.send();
您的控制台将记录一个function
.
如果你有:
var b = new XMLHttpRequest();
b.send();
您的控制台将记录null
.
这是发生这种情况的演示:http: //jsfiddle.net/3XKx7/
(我清楚地省略了发送 AJAX 请求的其他步骤,这只是为了解释)
我并不是要暗示null
and之间存在关系undefined
-我只是说在创建 new 时XMLHttpRequest
,onreadystatechange
将在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
的任何顺序,但只有在这两个之后我才应该调用。onreadystatechange
open
send
因此,如果始终这样做,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
方法时,onreadystatechange
是null
因为 jQuery在调用send
. 我不知道他们这样做的原因......这可能是为了防止像你正在做的事情......但我从未听说或看到使用这种约定。
所以你得到它的价值的原因null
是因为 jQueryonreadystatechange
在调用send
. 这意味着当您覆盖send
并尝试访问该onreadystatechange
属性时,它尚未设置。
希望这是一个可以帮助您理解的示例:http: //jsfiddle.net/dMP6q/16/