1

私はこの2つの方法を持っています:

Cluster.prototype.initiate_xhr_request = function(url, callback) {
    var self = this,
        request = (Modernizr.test_xmlhttprequest) ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
    request.onreadystatechange = function() {
        if(request.readyState === 4) {
            switch(request.status) {
                case 200:
                    callback.apply(request,[ request.statusText ]);
                    break;
                case 400:
                    callback.apply(request,[ request.statusText ]);
                    break;
                default:
                    break;
            };
        } else 
            console.log('An error occured during the XHR request');
        }
    };
    request.open("HEAD", url, false);
    request.send();
};

Cluster.prototype.operations = {
    '&&': function(array){ 
        return array.reduce(function(previousValue, currentValue, index, array){
             return previousValue && currentValue;
         })
     },
    '||' : function(array){
        return array.reduce(function(previousValue, currentValue, index, array){
            return this.initiate_xhr_request(previousValue) || currentValue;
        })}
};

EDIT:メソッドは次のように呼び出されます:

Cluster.prototype.calculate = function(operation, array){
    return this.operations[operation](array);
};

/* call the calculate function */

this.calculate('&&', some_array);

明らかに、この行this.initiate_xhr_request(previousValue)は機能しません。私はそこでやろうとしていることを行うための良い解決策を見つけようとし続けましたが、見つけることができませんでした (: それを行い、同じ構造を維持する方法はありますか ?

4

1 に答える 1

1

.callまたはを使用して、呼び出しているメソッド.applyの値を手動で設定できます。this

ここで、 の値を現在のレキシカル環境のthis値に設定します。(代わりにを使用すると同じことが行われますが、あなたを取り、そのメンバーを個々の引数として渡しますが、これは望ましくないようです。)this.operations[operation].apply.callarray

Cluster.prototype.calculate = function(operation, array){
    return this.operations[operation].call(this, array);
};

これらのメソッドでは、メソッドのコールバックで値が保持されthisていることを確認する必要があることを除いて、値は期待どおりになります。this.reduce()"||"

これを行う古典的な方法は、コールバックでその変数を参照する、外側のレキシカル環境への変数参照を保持することです。

Cluster.prototype.operations = {
    '&&' : ...,
    '||' : function(array){
        var self = this;
        return array.reduce(function(previousValue, currentValue, index, array){
            return self.initiate_xhr_request(previousValue) || currentValue;
        })}
};

しかし、より現代的な方法は、値を手動でバインドFunction.prototype.bindして新しい関数を作成するために使用することです。this

Cluster.prototype.operations = {
    '&&' : ...,
    '||' : function(array){
        return array.reduce(function(previousValue, currentValue, index, array){
            return this.initiate_xhr_request(previousValue) || currentValue;
        }.bind(this))}
};
于 2012-10-21T18:20:20.653 に答える