1

我正在尝试为 chrome 扩展创建一个简单的 ajax 类。Uncaught TypeError: Cannot read property 'readyState' of undefined尝试运行代码时出现未定义的错误 。似乎是什么导致了这个问题?

function ajax(arguments, callback) {
    this.xhr = new XMLHttpRequest();
    this.xhr.open(arguments.requestType, arguments.requestUrl + arguments.requestParameters, true);
    this.xhr.onreadystatechange = function() {
        if (this.readyState === 4 && this.status === 200) {
            requestedData = JSON.parse(this.responseText);
            callback(requestedData);
        }
    }
    this.xhr.send();
}

var ajaxRequest = new ajax({ 
    requestType: 'GET',
    requestUrl: 'http://ezswag.com/bots/terms.php',
    requestParameters: ' ',
    }, function(json) {
        //console.log(json);  => json {apple: "red", cheery: "red"}
        return json;
    });

    console.log(ajaxRequest);

(更新的代码和工作

4

3 回答 3

4

的值this取决于函数的调用方式。

当您将ajax函数作为构造函数调用时(请注意,约定说您应该以大写字母开头构造函数名称)this是正在创建的实例。

readyState函数中,this是 XMLHttpRequest 对象。

this.xhr您对函数内部的所有引用都readyState应该是简单的this

于 2013-01-04T14:10:33.853 回答
1

您不能在函数内部使用 this.xhr。这是对当前函数的引用,而不是您的想法。

使用这样的临时变量:

var self = this;

this.xhr.onreadystatechange = function() {
    if (self.xhr.readyState === 4 && self.xhr.status === 200) {
        requestedData = JSON.parse(self.xhr.responseText);
        console.log(requestedData);
    }
}
于 2013-01-04T14:09:24.443 回答
1

在您的onreadystatechange实施中,this并不是您认为的那样。您需要捕获ajax函数的范围并在回调中使用它。

function ajax(parameter) {
    var that = this;
    this.xhr = new XMLHttpRequest();
    this.xhr.open(parameter.requestType, parameter.requestUrl + parameter.requestParameters, true);
    this.xhr.onreadystatechange = function() {
        if (that.xhr.readyState === 4 && that.xhr.status === 200) {
            requestedData = JSON.parse(that.xhr.responseText);
            console.log(requestedData);
        }
    }
    this.xhr.send();
}
于 2013-01-04T14:09:41.330 回答