Причина в том, что onstatechange
вызывается как обработчик события, а указатель this
, скорее всего, указывает на объект, с которым сработало событие, а не на объект ajaxRequest
, как вы ожидаете.
При переписывании ниже переменная this
сохраняется в переменной с именем that
в контексте выполнения, к которому имеет доступ функция onstatechange (). Это должно решить проблему.
Самое длинное и короткое из этого - если вы не совсем понимаете контексты закрытия Javascript и контексты выполнения, и даже если вы это понимаете, вам гораздо лучше использовать инфраструктуру для выполнения ваших запросов AJAX. JQuery и Prototype - хороший выбор.
function ajaxRequest()
{
var httpObject;
this.open = open;
this.callback = function(){};
var that = this;
function getHTTPObject()
{
if (window.ActiveXObject)
return new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest)
return new XMLHttpRequest();
else
{
alert("Your browser does not support AJAX.");
return null;
}
}
function onstatechange()
{
if(httpObject.readyState == 4)
{
that.callback(httpObject.responseText);
}
}
function open(url, callback)
{
httpObject = getHTTPObject();
if (httpObject != null)
{
httpObject.open("GET", url, true);
httpObject.send(null);
this.callback = callback;
httpObject.onreadystatechange = onstatechange;
}
}
}