簡體   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