繁体   English   中英

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

[英]How to access method variables from within an anonymous function in JavaScript?

我正在编写一个供个人使用的小型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);
    }
}

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

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

var that = this;

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

如果callback是包含函数中的变量,则应在范围内。 如果它不是变量,但在包含函数的范围内,则可能必须执行类似的操作

var cb = callback;
var xhrRequest = this;

然后

cb(xhrRequest.responseText);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM