2012-05-09 6 views
16

Function.prototype.bindを使用してカレーリングやその他のテクニックについて私の頭を包んでいます。
特定の状況で機能範囲(つまり、this値)を変更することは非常に便利です。JavaScriptのバインドされた関数からアンバウンド関数を取得できますか?

しかしit looks like you can't change the scope with bindあなたはすでにそのようにした後:

function f = obj.method.bind(42); 
function g = obj.method.bind('Hi'); 

function f2 = f.bind('Hi'); // “this” is still 42 

それがすべてでバインドされた機能から元の未結合の機能を取得することは可能ですか?基本的には指定されたコンテキストと引数で自身を呼び出す別の関数を返すですので

function bind(context) { 
    var self = this; 
    return function() { 
     self.apply(context, arguments); 
    } 
} 

:(引数はコンテキストを除外するためにスライスされているので、ない正確に)bind方法は、基本的に何

+4

試してみましたか? –

+0

@マーティン:今私はフィドルを作成しています。それは答えを知っている人にとっては非常に単純な質問のように思えます。なぜ私は先の研究なしで質問を投稿したのですか? –

+0

@Martin:私の仮定を確認しました。(http://jsfiddle.net/dXq2E/)、実際には 'bind'を使ってスコープを2回変更することはできません。それで、それはまったく可能ですか?何らかの種類の「アンバインド」がありますか? –

答えて

15

のようなものです。

function bind(context) { 
    var self = this; 
    return function() { 
     self.apply(context, arguments); 
    }.bind(otherContext); 
} 

しかし、内側の関数は元のコンテキストクロージャとしてバインド行為によって返されたので:あなたはその後bind再び、あなたはbindは以下のように実装されたかのようになりますこれは、この新しく作成された機能を結合することがあります場合は最初にバインドされたもの(self)、あなたの関数でコンテキストが実際に実行されることになります。

22

Win32's answerを絵で説明すると便利だと思いました。

bindによって生成されたラッパーは、指定されたコンテキストが何であっても関数が呼び出されるようにします。
このようなラッパーは、は常に自分のコンテキストを無視します。

ラッパーのチェーンがある場合、最も内側のコンテキストは失われます。
したがって、bindを使用して設定したコンテキストを変更する方法はありません。

Chained bind calls

+0

いいえ視覚的説明:) – Win32

+0

クールな説明@ダン・アブラモフ!! –

関連する問題