如何从JavaScript中的匿名函数中访问方法变量?

时间:2010-05-23 21:54:00

标签: javascript scope

我正在写一个小的ajax类供个人使用。在课堂上,我有一个发布帖子请求的“帖子”方法。 post方法有一个回调参数。在onreadystatechange属性中,我需要调用回调方法。

这样的事情:

this.requestObject.onreadystatechange = function() {
    callback(this.responseText); 
}

但是,我无法从自治函数中访问回调变量。如何将回调变量带入onreadystatechange自治函数的范围?

编辑:

到目前为止,这是完整的代码:

function request()
{
    this.initialize = function(errorHandeler)
    {
        try {
            try {
                this.requestObject = new XDomainRequest();
            } catch(e) {
                try {
                    this.requestObject = new XMLHttpRequest();
                } catch (e) {
                    try {
                        this.requestObject = new ActiveXObject("Msxml2.XMLHTTP"); //newer versions of IE5+
                    } catch (e) {
                        this.requestObject = new ActiveXObject("Microsoft.XMLHTTP"); //older versions of IE5+
                    }
                }
            } 
        } catch(e) {
            errorHandeler();
        }
    }

    this.post = function(url,data,callback)
    {
        var response;var escapedData = "";
        if (typeof data == 'object') {
            for (i in data) {
                escapedData += escape(i)+'='+escape(data[i])+'&';
            }
            escapedData = escapedData.substr(0,escapedData.length-1);
        } else {
            escapedData = escape(data);
        }
        this.requestObject.open('post',url,true);
        this.requestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        this.requestObject.setRequestHeader("Content-length", data.length);
        this.requestObject.setRequestHeader("Connection", "close");
        this.requestObject.onreadystatechange = function()
        {
            if (this.readyState == 4) {
                // call callback function
            }
        }
        this.requestObject.send(data);
    }
}

3 个答案:

答案 0 :(得分:4)

只需将回调函数与其余参数一起传递

this.post = function(url, data, callback) {
    ...
    this.requestObject.onreadystatechange = function() {
        if (this.readyState == 4) {
            callback(this.responseText);
        }
    };
    ...
}

然后

foo.post("foo.html", {foo:"bar"}, function(result){
    alert(result);
});

顺便说一句,这是将数据转换为正确字符串的更好方法

var q = [];
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        q.push(key + "=" + encodeURIComponent(data[key]));
    }
}
data = q.join("&"); //data can now be passed to .send()

encodeURIComponent是在此使用的正确函数,因为encode无法正确转义数据

如果你想为所有这些做一个现成的功能,你可以看看http://github.com/oyvindkinsey/easyXDM/blob/master/src/easyXDM.js#L358

答案 1 :(得分:0)

var that = this;

然后在匿名函数中使用that代替this

答案 2 :(得分:0)

如果回调是包含函数中的变量,则它应该在范围内。如果它不是变量,但在包含函数的范围内,则可能需要执行类似

的操作
var cb = callback;
var xhrRequest = this;

然后

cb(xhrRequest.responseText);