2017-11-07 15 views
0

ここで働いているコードサンプルは:私はこのコードの代わりに、「ブーム」から.bind(drum)一部を削除した場合なぜメソッド関数でsetIntervalにバインドする必要がありますか?

function Drum(){ 
    this.noise = 'boom'; 
    this.duration = 1000; 
    this.goBoom = function(){console.log(this.noise)}; 
} 
var drum = new Drum(); 
setInterval(drum.goBoom.bind(drum), drum.duration); 

私は、コンソールに「未定義」を取得します。 typeof drum.goBoomは「機能」を返すので、このような動作の理由は何ですか?

+2

あなたの例で実際には定義されていないのは、「ノイズ」です。 'this'はDrumインスタンスを参照しないため(実際には参照するウィンドウインスタンスだと思います) – musefan

+0

yep、Timeoutオブジェクト – Anton

答えて

1

bindのドキュメントをご覧ください。

bind()メソッドが呼び出され、新たな機能を作成し、新しい関数が呼び出されたときに提供される任意の前の引数の指定された配列と、与えられた値にそのthisキーワードが設定されています。

あなたがコール内で、その後thisbind(drum)を省略した場合、バックしたいdrumオブジェクト以外のものになります。 typeof drum.goBoom返す '関数' は

2

これは実際に無関係です。ここで重要なキーワードはthisです。あなたはそれがnoiseキーワードを持っていないthis値(コンテキスト)だとして手動setIntervalはグローバルオブジェクトと関数を呼び出しthisキーワードの値を設定するためのbindを使用せずに、setInterval関数の最初の引数としてdrum.goBoomを渡すことにより、機能の参照を渡しています、console.logログundefinedです。

関連する問題