2016-11-26 30 views
1

setIntervalとコンストラクタのメソッドを操作する方法。 console.logが未定義を示しています。なぜ誰かがsetIntervalからコンストラクタの変数にアクセスする方法を説明することができます。setIntervalとコンストラクタを使用するにはどうすればいいですか?

var aa=new test(); 
var bb; 
window.onload= function(){ 
    bb=setInterval(aa.b,1000); 
} 
function test(){ 
    this.a=1; 
    this.b=function(){ 
     console.log(this.a); 
    } 
} 

答えて

2

このような関数でラップしてみてください。

setInterval(() => aa.b(), 1000); 

あなたの方法がうまくいかない理由は、あなたがたsetIntervalにBの関数を渡すということですが、それはそれはthis参照です失い、 thisはグローバルウィンドウオブジェクトになり、window.aは未定義です。

aaオブジェクトで関数を呼び出すと、関数にラップすると、thisaaになります。

あなたは別の関数であなたの関数をラップしたくない場合は、あなたもbindを使用することができます。ここでは

setInterval(aa.b.bind(aa), 1000); 

thisaaことを余儀なくされています。

+0

ああコム」に! :)私はあなたの直前に "バインドバージョン"について答えました:) –

+0

それを逃しました。 +1 –

1

他の人が正しいか - thisは(正確に)修正する簡単な方法、もうtestインスタンスにない指し、これは新しい変数を使用している:

var aa=new test(); 
var bb; 
window.onload= function(){ 
    bb=setInterval(aa.b,1000); 
} 
function test(){ 
    var self = this; //keep the right 'this'. 
    this.a=1; 
    this.b=function(){ 
     console.log(self.a); //changed, `self` instead of `this` 
    } 
} 
関連する問題