2016-04-18 7 views
1

私はバインド、コールについて学び、そして適用し、私はそれのために良い反応を見つけることができませんでしたバインドについての質問持っている:すぐに呼び出すメソッド

は私が持っていると言うが次のコード

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つのコンテキストを持ち、最初のものに行くからです。

いずれの場合も考えていますか?

+1

正確に何を求めているのかはっきりしません。 – zerkms

+1

2番目の 'bind'が' this'値を変更することができれば、最初の 'bind'がそれを束縛しなかったことを意味します。 – Oriol

+0

* "今fNameのコンテキストはウィンドウです" * - そうではありません。コンテキストは、その関数への参照を作成するたびに*呼び出されるたびに設定されます。 fNameとJim.fullNameは同じ関数への参照です。 .bind()に関して、彼らはそれが返す関数をただちに呼び出すことを呼びかける点はありません。あなたが言うように.call()または.apply()を使用するかもしれないと言われています。 .bind()のポイントは、あなたが別の場所で呼び出すことができる関数を作成することです。それは、返された関数を変数に代入するか、他の関数の引数として渡すことです。 – nnnnnn

答えて

0

あなたは本質的に全面的に正しいです。

var fName = Jim.fullName; 
fName.bind(Jim)(); 

を行うと、私は「悪い習慣」最初の例を呼びたいかわからないが、それは間違いではありません

var fName = Jim.fullName; 
fName.call(Jim); 

とまったく同じものです「良い習慣。」 callは、新しい関数値を生成せずにあなたが望むものを正確に行い、私の意見ではあなたの意図をよりよく説明します。

なぜ機能をリバインドできないのかについては、非常に近いです。 fNameには2つのコンテキストがあるのではなく、まだ1つしかありません。しかし、bindは「これはこの関数のコンテキストですが、疑問はありません」と明示的に述べています。

0

以前と同じfName関数に拘束されなくなりました。 bindは、thisの値を上書きできない新しい結合関数を返します。 MDN docs 1として

バインド()関数は、それがされている関数と同じ機能本体(ECMAScriptの5点で内部コールプロパティ)と新しい機能(バウンド関数)を作成しますbind()の最初の引数にバインドされたこの値を持つon(バインドされた関数のターゲット関数)を呼び出すと、に上書きできません。

+0

私はドキュメントのこの部分を見ませんでした!オーバーライドできない部分はかなりクリアです:)あなたの応答に感謝します。 –

関連する問題