onreadystatechange
存在...所以它是 null
。如果它不存在,那么它就是 undefined
。这完全取决于它是否已经设置过。显然,它已经是一个属性,因为它是 null
...如果不是,它就会是 undefined
...或者至少 "onreadystatechange" in this
会是 false
。
下面是一个例子:
var a = new XMLHttpRequest();
a.onreadystatechange = function () {
};
a.send();
您的控制台将记录一个函数
。
如果您有:
var b = new XMLHttpRequest()
b.send()
您的控制台将记录 null
。
这是发生的情况的演示:http://jsfiddle.net/3XKx7/
(我已经清楚地省略了发送 AJAX 请求的其他步骤,这只是为了说明)
我并不是试图暗示 null
和 undefined
之间存在关系 - 我只是想说,在创建新的 XMLHttpRequest
时,onreadystatechange
将在内部设置为 null
。无论您是否将其设置为函数,都取决于您。
更新:
创建/发送 XHR 的正常方式如下:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
};
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
是因为 jQuery 在调用
send
后设置了
onreadystatechange
。这意味着当你覆盖
send
并尝试访问
onreadystatechange
属性时,它还没有被设置。
希望这个示例可以帮助你理解:
http://jsfiddle.net/dMP6q/16/。