2013-02-20 10 views
8

私は両方ともあなたが 'this'の価値をコントロールできると信じていますが、それを超えて、私は少しはっきりしておらず、Google/SOはあまり助けてくれていません。任意の明確化が認められた。私はこれを見つけたが、私はそれが全体的な話告げることに懐疑的だ:

「私が最初にjQueryのプロキシ()メソッドを知ったとき、私はそれが 少し愚かだと思ったが、結局、Javascriptがすでに持っていますjQueryのproxy()メソッドを使用すると、コンテキストに関係なくハンドラーを簡単にbind()およびunbind()することができます。 このメソッドは。

+0

Google-fuの便利な検索キーワード:JavaScriptの実行コンテキスト。 – cmbuckley

+2

多くのjQueryのものは完全に無意味です。多くの人が 'this.id'の代わりに'(this).attr( 'id') 'を瞬時に使うのが良いと思っているという事実。私は '$ .proxy'を見ていませんが、全く同じである可能性があります:冗長で無意味です。 –

+0

@Kolink適用する戻り値の関数を返す関数を書くときのことです。ほとんどすべてのライブラリがこの方法を持っています。 – epascarello

答えて

11

コールに渡されたオブジェクトにバインドされているので、それは1をログに記録することを意味適用/シングルショット呼び出しがあります。それはに類似している

$.proxy = function(fn, newThis) { 
    return function() { 
     fn.call(newThis); 
    } 
} 

:単純化したよう

fn.call(foo); //call once 

var otherFn = $.proxy(fn, foo); // you can call it again later 

var otherOtherFn = fn.bind(foo); // ES5 standard way 

非常に単純化された)、$.proxycallを呼び出す新しい関数を作成している:$ .proxyは恒久的なものにバインドされた新しい関数を作成しますES5のFunction.prototype.bind

5

jQueryソース:

proxy: function(fn, context) { 
    var tmp, args, proxy; 

    if (typeof context === "string") { 
     tmp = fn[ context ]; 
     context = fn; 
     fn = tmp; 
    } 

    // Quick check to determine if target is callable, in the spec 
    // this throws a TypeError, but we will just return undefined. 
    if (!jQuery.isFunction(fn)) { 
     return undefined; 
    } 

    // Simulated bind 
    args = core_slice.call(arguments, 2); 
    proxy = function() { 
     return fn.apply(context || this, args.concat(core_slice.call(arguments))); 
    }; 

    // Set the guid of unique handler to the same of original handler, so it can be removed 
    proxy.guid = fn.guid = fn.guid || jQuery.guid++; 

    return proxy; 
}, 

あなたは(私は正しくスライスコードを翻訳思う)キャッシュコードを削除して、それは少し短い、あなたは本質的.apply()をプレゼント場合:

proxy: function(fn, context) { 
    var args = [].slice.call(arguments, 2); 

    return function() { 
     return fn.apply(context || this, args.concat([].slice.call(arguments))); 
    }; 
} 
1

$.proxyは、関数を呼び出すことができますし、それが返す関数は常に特定のコンテキストを持ちます。それはあなたが

$.proxy(function() {console.log(this.val)}, {val: 1}).call({val: 2}); 

を実行した場合、この関数は常に最初にproxy

関連する問題