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

如何从JavaScript中的匿名函数中访问方法变量?,javascript,scope,Javascript,Scope,我正在编写一个供个人使用的小ajax类。在课堂上,我有一个“post”方法来发送post请求。post方法有一个回调参数。在onreadystatechange属性中,我需要调用回调方法 大概是这样的: this.requestObject.onreadystatechange = function() { callback(this.responseText); } 但是,我无法从匿名函数中访问回调变量。如何将回调变量引入onreadystatechange匿名函数的作用域 编辑:

我正在编写一个供个人使用的小ajax类。在课堂上,我有一个“post”方法来发送post请求。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);
    }
}
然后在匿名函数中使用
that
而不是
this


然后在匿名函数中使用
that
而不是
this

如果回调函数是包含函数中的变量,它应该在作用域中。如果它不是一个变量,但在包含函数的作用域中,您可能需要执行以下操作

var cb = callback;
var xhrRequest = this;
然后


如果回调函数是包含函数中的一个变量,那么它应该在作用域中。如果它不是一个变量,但在包含函数的作用域中,您可能需要执行以下操作

var cb = callback;
var xhrRequest = this;
然后


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

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
不会正确转义数据


如果您想为所有这些获得一个现成的函数,您可以在这里查看一下

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

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
不会正确转义数据


如果您想为所有这些准备一个现成的函数,您可以在重新阅读问题后查看此处

,我认为他在
这方面没有问题
,问题似乎是访问
回调
标识符…
在本例中是正确的-要了解更多信息,我们需要查看更多代码在重新阅读问题后,我认为他在
方面没有问题,访问
回调
标识符时出现问题…
在本例中是正确的-要了解更多信息,我们需要查看更多的代码。是否发布更完整的代码示例?您说
“post方法具有回调参数。”
但不在您发布的代码中…您能发布一个更完整的代码示例吗?您说
“post方法有一个回调参数。”
但不在您发布的代码中…这根本不会改变任何东西,它只会在同一范围内创建新引用。这根本不会改变任何东西,它只是在同一范围内创建新的引用。谢谢,这很有效。有几个问题。1.如果key已经引用了属性,为什么要使用hasownproperty?2.密钥不也需要编码吗?再次感谢。1),以防通过原型链继承某些属性2)仅当您使用具有非ascii值、空格、撇号等的键时。是吗?谢谢,这很有效。有几个问题。1.如果key已经引用了属性,为什么要使用hasownproperty?2.密钥不也需要编码吗?再次感谢。1),以防通过原型链继承某些属性2)仅当您使用具有非ascii值、空格、撇号等的键时,您会这样做吗?