2

私はvarself=この代替プランを探しています。

var Animal = function(name){
  this.name = name;
  this.arr = [1,2,3,4];
  this.inc = function(num){
      return num + 1;
  };

  this.fireArr = function(){
    var self = this;
    this.arr.forEach(function(item){
      console.log(self.inc(item));
    });

  };

};

var dog = new Animal("dog");
console.log(dog.fireArr());

私のフィドルはここにあります。

http://jsfiddle.net/haradashinya/TtYpc/

何か考えはありますか?

前もって感謝します。

4

3 に答える 3

6

2番目の引数を値forEachであるに設定できthisます。

this.arr.forEach(function(item){
  console.log(this.inc(item));
}, this);
于 2012-08-05T17:41:39.210 に答える
5

.bind()関数が正しいthis値で呼び出されていることを確認するために使用できます。

function fireArr() {
    this.arr.forEach(function(item){
        console.log(this.inc(item));
    }.bind(this));
}

しかし、imho selfthat_this)変数は、通常の値が使用されていないことを直接示しているため、理解しやすくなっていthisます(たとえば、イベントハンドラーやjQueryのeach())。特に、最後にが表示されない長い関数ではbind()、これは重要です。また、一部の古いブラウザはサポートしていないためbind()、シムする必要があります。

したがって、インプレース関数式には、間接参照変数の使用をお勧めします。

ただし、どこかでメソッドを定義している場合は非常に便利です。通常thisは、そのコンテキストで一般的であるため、現在のオブジェクトを指すために使用します。その後、メソッドを別の場所で使用する必要があります。-wrapperの代わりに、単純さと明確さのためにvar self使用でき、使用する必要があります。bindあなたの例は非常に良いデモを提供します(incメソッドがthisキーワードを使用したと仮定します):

this.arr.forEach( this.inc.bind(this) );

(ただしforEach()、カスタムthis引数を渡すことはできますが、たとえばイベントアタッチメントは渡さないでください)

于 2012-08-05T17:40:32.340 に答える
3

あなたの例では、inc関数はthis値を使用しないため、メソッドである必要はありません。ローカル関数として定義できます。

var Animal = function ( name ) {
    this.name = name;
    this.arr = [ 1, 2, 3, 4 ];

    var inc = function ( num ) {
        return num + 1;
    };

    this.fireArr = function () {
        this.arr.forEach(function ( item ) {
            console.log( inc( item ) );
        });
    };
};
于 2012-08-05T17:49:51.833 に答える