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
和undefined
之间的关系 - 我只是说在创建新的XMLHttpRequest
时,onreadystatechange
将在内部设置为null
。无论您是否将其设置为功能,都取决于您。
UPDATE:
创建/发送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
的原因是因为jQuery调用send
后设置onreadystatechange
。这意味着当您覆盖send
并尝试访问onreadystatechange
属性时,它尚未设置。
希望这是一个例子,可以帮助您了解:http://jsfiddle.net/dMP6q/16/
来源
2013-04-05 13:59:36
Ian
,它的'null'而不是'undefined'(或抛出一个不确定的除外),这一事实应该解释 - 它只是还没有确定呢。 – Ian 2013-04-05 13:51:34
该函数只是用一些日志记录封装'send'方法。由于您没有向我们展示使用它的代码,因此我们无法说出为何在调用send时函数为null。 – Quentin 2013-04-05 13:54:14