如何从JavaScript中的匿名函数中访问方法变量?
我正在编写一个供个人使用的小ajax类。在课堂上,我有一个“post”方法来发送post请求。post方法有一个回调参数。在onreadystatechange属性中,我需要调用回调方法 大概是这样的:如何从JavaScript中的匿名函数中访问方法变量?,javascript,scope,Javascript,Scope,我正在编写一个供个人使用的小ajax类。在课堂上,我有一个“post”方法来发送post请求。post方法有一个回调参数。在onreadystatechange属性中,我需要调用回调方法 大概是这样的: this.requestObject.onreadystatechange = function() { callback(this.responseText); } 但是,我无法从匿名函数中访问回调变量。如何将回调变量引入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值、空格、撇号等的键时,您会这样做吗?