-1

jsを学習するためだけに、すべての配列要素をループするヘルパー関数を作成しています。

コードは次のとおりです。

function arrayLoop(array, func){

    var ar = array.length,
        i=0;

    for ( i = 0; i < ar; i++ ){
        func(i);
    };

};

次のように使用すると機能します:

var foo = ['aa','bb','cc'];

arrayLoop(foo, function(i){
    alert(foo[i]);
});

しかし、オブジェクト内でそれを実行しようとして、このコンテキストを使用したい場合、エラーが発生します:

function test(){

   this.foo = ['aa','bb','cc'];
   this.bar = ['ff','gg','hh'];

}

test.prototype.find = function(){

  arrayLoop(this.foo, function(i){

     alert(this.bar[i])     //error- there is no this.bar 

  };  

};

親を自動的にarrayLoop関数に渡す方法??

4

4 に答える 4

2

コンテキスト パラメーターを許可するように arrayLoop を変更できます。

function arrayLoop(array, ctx, func){
    ctx = ctx || window;
    var len = array.length, i = 0;
    for ( i = 0; i < len; i++ ) {
        func.call(ctx, i);
    }
}

test.prototype.find = function(){
  arrayLoop(this.foo, this, function(i) {
     alert(this.bar[i]);     // this will work
  });
}

これにより、コールバックに目的の値を渡すことができthis、コールバックが呼び出されたときに設定され、すべてのブラウザーで機能します (.bind()古いブラウザーでは機能しません)。

参考まで)に、find()関数にも a がありませんでした。害を及ぼさない余分なセミコロンがいくつかあるようですが、そこにある必要はありません。

于 2013-03-30T10:24:36.173 に答える
1

クロージャーでそれをキャプチャできます:

test.prototype.find = function() {
    var self = this;
    arrayLoop(this.foo, function(i) {
        alert(self.bar[i]);
    });
};

または次の.bind()関数を使用します。

test.prototype.find = function() {
    arrayLoop(this.foo, function(i) {
        alert(this.bar[i]);
    }.bind(this));
};
于 2013-03-30T10:17:42.853 に答える
1

bindメソッドを使用します。

test.prototype.find = function(){
    arrayLoop(this.foo, method.bind(this));
}

test.prototype.method = function(i){
    alert(this.bar[i]);
};

ここでコードが機能しない理由の説明を見つけることができます

于 2013-03-30T10:28:06.457 に答える
0

関数をオブジェクトにバインドします。

test.prototype.find = function(){

  arrayLoop(this.foo, function(i){

     alert(this.bar[i])     //error- there is no this.bar 

  }.bind(this));  

};
于 2013-03-30T10:24:05.777 に答える