2016-05-12 18 views
0

私はこれに似た質問がいくつかあることを理解していますが、オブジェクト関数内からコールバック関数が呼び出されたときに、なぜこのようなコンテキスト(値)が変化するのかを知ることができませんでした。 関数内からコールバックが呼び出されたとき、なぜ(this)の値が変わるのですか?

var obj = { 
      objproperty: "this is a property of obj", 
      func1: function(x,cb){ 
        console.log(this) // refers to obj 
        var output_value = x + 20; 
        cb(output_value); 
      } 
      }; 

obj.func1(123,function(output_value){ 
console.log(output_value); 
console.log(this); // does this refers to window or undefined?? 
}); 

私が知っている限り、これは3番目のconsole.logに 'this'を付けてはいけません。それはobjオブジェクトで呼び出されたので?

答えて

1

objオブジェクトで呼び出されましたか?

いいえ、そうではありません。

cb(output_value); 

ありcbの左側には何もありませんので、それはデフォルトのコンテキストで呼び出されます。非strictモード、またはundefined

cb(output_value); 

あり、その関数の呼び出しにはオブジェクトコンテキストがいないので、thisの値がwindow(またはグローバル・コンテキスト)のいずれかになります:

1

あなたのコールバックは、このように呼ばれています厳密なモードで。

あなたはコールバックはそれを呼び出している状況で、あなたは.call()を使用することができます一致するthis値を持っていることを確認するには:

cb.call(this, output_value); 
関連する問題