私はバインド、コールについて学び、そして適用し、私はそれのために良い反応を見つけることができませんでしたバインドについての質問持っている:すぐに呼び出すメソッド
は私が持っていると言うが次のコード
var Jim = {
firstName: 'Jim',
lastName: 'Bob',
fullName: function() {
return this.firstName + ' ' + this.lastName;
}
};
var fName = Jim.fullName; //now fName's context is window
//If I invoke fName here, I will get the expected 'undefined undefined'
console.log(fName());
私は、しかし、も行うことができ、次の新しいコンテキストを通過した後、すぐに呼び出すことが私のバインドされたメソッドを取得する:どのようなことができます(ちょうど模倣され
fName.bind(Jim)(); //this returns 'Jim Bob'
私はこのように感じるのsh ?)は、call
またはapply
で行う必要があります。前の行の後でfName()
を再度呼び出すと、それはまだウィンドウオブジェクトにバインドされています(fNameはbindのin placeで変更されていません)。これは悪い習慣ですか?私はこの第二の場合には信じる
fName.bind(Chris)(); //this still logs 'Jim Bob' from the original context
:
var Jim = {
//same object definition as above
};
var Chris = {
firstName: 'Chris',
lastName: 'Smith'
};
var fName = Jim.fullName.bind(Jim); //now fName's context is the Jim object
console.log(fName()); //this will log 'Jim Bob' as expected
そして、私が代わりに別のコンテキストにバインドされたメソッドをバインドしようとした場合NOW、それは動作しません。どのようにこのかかわらについて
これは基本的に「束縛された関数」を作成しているので、2つのコンテキストを持ち、最初のものに行くからです。
いずれの場合も考えていますか?
正確に何を求めているのかはっきりしません。 – zerkms
2番目の 'bind'が' this'値を変更することができれば、最初の 'bind'がそれを束縛しなかったことを意味します。 – Oriol
* "今fNameのコンテキストはウィンドウです" * - そうではありません。コンテキストは、その関数への参照を作成するたびに*呼び出されるたびに設定されます。 fNameとJim.fullNameは同じ関数への参照です。 .bind()に関して、彼らはそれが返す関数をただちに呼び出すことを呼びかける点はありません。あなたが言うように.call()または.apply()を使用するかもしれないと言われています。 .bind()のポイントは、あなたが別の場所で呼び出すことができる関数を作成することです。それは、返された関数を変数に代入するか、他の関数の引数として渡すことです。 – nnnnnn