2017-01-10 6 views
0

私は、オブジェクトのメソッド(オブジェクトの独自のプロパティの1つを更新する)を引数として別の関数に渡すと、元のオブジェクトは変更されないことに気付きました。例えばJavaScriptオブジェクトのメソッドを渡すとオブジェクトが更新されないのはなぜですか?

var obj = { 
    foo: 0, 
    bar: function() { 
     this.foo++; 
    } 
}; 

function baz(callback) { 
    callback(); 
} 

baz(obj.bar); // does not alter obj 
obj.bar(); // increments obj.foo successfully 
console.log(obj.foo); // should be 2, not 1 

なぜJavaScriptのオブジェクトは参照渡しされているので、これは、ありますか?またはthis値 - - 機能のそれははない、それは定義さだ方法で、と呼ばれていますどのように基づいている状況があるため

+0

ここをクリックしてください:http://stackoverflow.com/questions/3630054/how-do-i-pass-the-this-context-to-a-function – Dai

答えて

2

です。 bar関数は、objオブジェクトの内部にあることを認識しません。

あなたがobj.bar();を行うと、あなたは、このようにthisは、あなたが期待するものである、objの文脈でそれを呼び出しています。

baz(obj.bar);を実行するときは、bar関数をパラメータとして渡しています。 objオブジェクトとの関係はもはやありません。関数は変数のように扱うことができます。したがって、bazがそのコールバックを実行すると、「グローバル」コンテキスト(thiswindow)で実行されています。

.bind()を使用してthisの値を「ロック」することです。

baz(obj.bar.bind(obj)); 
0

コールバックを特定のオブジェクトにバインドする必要があるためです。あなたは同じ表現で呼び出しを実行するとき

baz(obj.bar.bind(obj)); 

機能のみを自動的に.前にオブジェクトにバインドされています。単にプロパティにアクセスしてもそれをバインドしません。

関連する問題