9

どちらも「これ」の値を制御できると思いますが、それ以上のことは少しわかりません.Google / SOは今のところあまり役に立ちません. 説明をいただければ幸いです。私はこれを見つけましたが、それが全体の話をしているのか懐疑的です:

「初めて jQuery の proxy() メソッドを知ったとき、ちょっとばかげていると思いました。結局のところ、Javascript には、実行コンテキストを変更するための call() メソッドと apply() メソッドが既に用意されています。しかし、jQuery の proxy() メソッドは、コンテキストに関係なく、簡単に bind() および unbind() イベント ハンドラーを実行できるため、このメソッドがいかに強力であるかが明らかになります。

4

3 に答える 3

12

call/apply は 1 回限りの呼び出しです。$.proxy は、何かに永続的にバインドされた新しい関数を作成します。

fn.call(foo);  //call once

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

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

単純化(非常に単純化)として、次$.proxyを呼び出す新しい関数を作成していますcall

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

ES5に似ていますFunction.prototype.bind

于 2013-02-20T23:24:57.170 に答える
6

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)));
    };
}
于 2013-02-20T23:20:30.090 に答える
1

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

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

1関数は常に最初に渡されたオブジェクトにバインドされるため、ログに記録されますproxy

于 2013-02-20T23:24:23.160 に答える