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

标签 javascript oop class-design callback

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

function ajaxRequest()
{
    var httpObject;

    this.open = open;
    this.callback = function(){};

    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)
        {
            this.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;
        }
    }
}

为什么open方法不把回调参数当作函数处理?

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

我该如何完成这项工作?

最佳答案

原因是因为 onstatechange 被作为事件处理程序调用,并且 this 指针可能指向触发事件的对象,而不是 ajaxRequest 对象,如您所料。

下面的重写将 this 变量存储在 onstatechange() 函数有权访问的执行上下文中名为 that 的变量中。这应该可以解决问题。

总而言之,如果您没有彻底理解 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;
        }
    }
}

关于javascript - 如何向 javascript 类添加回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456767/

相关文章:

javascript - $ 或 Mongo 的一部分在 Meteor 应用程序中吗?

javascript - 不要让在输入中写入大于 max 属性的数字

Javascript:如何从类的一个函数中的函数访问类属性

javascript - list 文件中的 update_url 禁用我的 chrome 扩展

c++ - 所有类实例方法的打印语句最后都打印出来了?

php - mysql查询的静态方法调用结果

javascript - 在保留对象引用和继承的同时组织原型(prototype) javascript

C++:使用友元类而不是编写 getter/setter 的错误做法?

c++ - 您可以通过返回指向对象的指针来链接方法吗?

javascript - 将不带协议(protocol)的 git ssh 转换为带协议(protocol)的 git ssh