2013-10-18 2 views
6

forEachを使用して、クラスのメソッドの1つで配列を繰り返し処理しています。 forEach内のクラスのインスタンスにアクセスする必要がありますが、このは未定義です。forEachループでこれにアクセスすると、未定義となります

var aGlobalVar = {}; 

(function() { 

    "use strict"; 

    aGlobalVar.thing = function() { 
     this.value = "thing"; 
    } 

    aGlobalVar.thing.prototype.amethod = function() { 
     data.forEach(function(d) { 
     console.log(d); 
     console.log(this.value); 
    }); 
} 
})(); 

var rr = new aGlobalVar.thing(); 
rr.amethod(); 

私はここで働いています:http://jsfiddle.net/NhdDS/1/

+1

私は完全なスクリプトでローカル変数を持っています。これは例のために剥奪されたバックスニペットです。 –

+0

確かにちょっと奇妙に思えました。 –

+1

@ Qantas94Heavy:また、彼は厳密に内部のものを作ることができます。 –

答えて

17

、プロパティ参照を介して機能をしませ呼び出し、thisがどうあるべきかを指定せずに、それはundefined.

forEachだ場合(spec | MDN)それはだ、あなたはthisがどうあるべきかを言うことができます(オプション)2番目の引数が、あなたがそれを渡す:

aGlobalVar.thing.prototype.amethod = function() { 
    data.forEach(function(d) { 
    console.log(d); 
    console.log(this.value); 
    }, this); 
    // ^^^^ 
} 

代わりに、arrow functionsはの上に近い矢印以来2015年JavaScriptに追加されましたの場合は、これを使用することができます:

aGlobalVar.thing.prototype.amethod = function() { 
    data.forEach(d => { 
    console.log(d); 
    console.log(this.value); 
    }); 
} 
+0

これについて知りませんでした!この**を一時的なvarに格納し** foreach **コンテキストで使用するよりも絶対に明確です。共有ありがとう! –

+0

私はこれと一緒に行くつもりです。私はChromium上にアプリを構築していますので、ECMA5はこの場合は問題ありません。ありがとう –

+0

私は 'forEach'ループの中でIDEに' this'の型を伝えるための方法がTypeScriptにあるとは思いませんか?私は現在、以下の 'const self = this'を実行しています。その後、' self'を使って私のIDEからオートコンプリートを取得します。これは理想的ではありません。 –

4

厳密なモードを使用しているので、オブジェクトのプロパティではない関数が呼び出されたときには、がグローバルオブジェクトではなく値undefinedになります。手動でその値を格納する必要があります

var aGlobalVar = {}; 

(function() { 
    "use strict"; 

    aGlobalVar.thing = function() { 
     this.value = "thing"; 
    }; 

    aGlobalVar.thing.prototype.amethod = function() { 
     var self = this; 
     data.forEach(function (element) { 
      console.log(element); 
      console.log(self.value); 
     }); 
    }; 
})(); 

var rr = new aGlobalVar.thing(); 
rr.amethod(); 

今日では、ES2015であなたも外機能のthis値を使用していますarrow functionsを、使用することができます。

function foo() { 
    let bar = (a, b) => { 
    return this; 
    }; 

    return bar(); 
} 

foo.call(Math); // Math 

T.J。 2番目の引数forEachを使用したCrowderの解決策は、一時変数の考え方が気に入らない場合にもうまく機能します(ES5コード:IE8を除いて、ほとんどすべてのブラウザで動作します)。 strictモードで

+0

ありがとうございます。私はこれを知っていた。なぜ私はそれを使用していないのか分かりません! Btwはconsole.log(thing.value)にする必要があります。上のコードでは? –

+0

@MikeRifgin:haha、はい。 –

関連する問題