如何向javascript类添加回调函数?

如何向javascript类添加回调函数?,javascript,oop,class-design,callback,Javascript,Oop,Class Design,Callback,javascript中的以下代码给出了错误“this.callback不是函数 为什么open方法不将回调参数视为函数 如果是,为什么我不能在onstatechange函数中调用它 如何实现这一点?原因是,onstatechange被作为事件处理程序调用,而此指针可能指向触发事件的对象,而不是您所期望的ajaxRequest对象 下面的重写将this变量存储在一个名为的变量中,该变量位于onstatechange()函数可以访问的执行上下文中。这应该可以解决问题 所有这些的长短不一之处在于,如果

javascript中的以下代码给出了错误“this.callback不是函数

为什么open方法不将回调参数视为函数

如果是,为什么我不能在onstatechange函数中调用它


如何实现这一点?

原因是,
onstatechange
被作为事件处理程序调用,而
指针可能指向触发事件的对象,而不是您所期望的
ajaxRequest
对象

下面的重写将
this
变量存储在一个名为
的变量中,该变量位于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;
        }
    }
}
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;
        }
    }
}