0

xmlhttprequest で変数にアクセスしようとしているときに問題が発生しました。私は次のコードを持っています:

function MyObject(){
    this.variable = 0;
}

MyObject.prototype = {
    request: function(url, call_function){
        try{
            if(window.XMLHttpRequest)
                httpRequest = new XMLHttpRequest();
            else if(window.ActiveXObject)
                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

            httpRequest.onreadystatechange = function(data)
            {
                try
                {
                    if(httpRequest.readyState == 4)
                    {
                        if(httpRequest.status == 200){
                            var tab = JSON.parse(httpRequest.responseText).childs;
                            call_function.apply(this, Array(tab));
                        } 
                    }
                }
                catch(e){}
            };
            httpRequest.open('GET', url);
            httpRequest.send();
        }
        catch(err){}
    },

    start: function(url){
        this.request(url, this.func);
    },

    func: function(){
        try{this.variable = 5;}
        catch(err){alert(err);}
    }
};

var obj = new MyObject();
obj.start(url);

このコードでは、プログラムが「func」関数を実行すると例外がキャッチされ、「this.variable」が定義されていないことがわかります。このプロパティにアクセスできない理由を知っていますか?

4

1 に答える 1

0

電話すると

call_function.apply(this, Array(tab));

thisインスタンス化された MyObject を参照しません。これは、宣言して onreadystatechange イベントに割り当てた関数を参照します。オブジェクトへの参照を保存する必要があります:

request: function(url, call_function){
    try{
        var self = this;
        if(window.XMLHttpRequest)
            httpRequest = new XMLHttpRequest();
        else if(window.ActiveXObject)
            httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

        httpRequest.onreadystatechange = function(data)
        {
            try
            {
                if(httpRequest.readyState == 4)
                {
                    if(httpRequest.status == 200){
                        var tab = JSON.parse(httpRequest.responseText).childs;
                        call_function.apply(self, Array(tab));
                    } 
                }
            }
            catch(e){}
        };
        httpRequest.open('GET', url);
        httpRequest.send();
    }
    catch(err){}
},
于 2013-08-09T08:25:25.890 に答える