[英]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.