2013-09-27 10 views
5

イベントハンドラ(つまり、$(...).on('something', myObject.handleSomething))としてメソッドを使用するコンテキストで。私は$ .proxyと_.bind(http://jsperf.com/bind-vs-jquery-proxy/27)のパフォーマンスの差が比較的大きいことを発見し、その実装を見ました。jQuery.proxyとアンダースコア.bind

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

をアンダースコア(http://underscorejs.org/docs/underscore.html#section-60が)(ctorのはvar ctor = function(){};で)戻って終わるながら:

args = slice.call(arguments, 2); 
return bound = function() { 
    if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); 
    ctor.prototype = func.prototype; 
    var self = new ctor; 
    ctor.prototype = null; 
    var result = func.apply(self, args.concat(slice.call(arguments))); 
    if (Object(result) === result) return result; 
    return self; 
}; 

私は_.bindは私が引数をバインドすることができますことを理解し

jQueryの(http://james.padolsey.com/jquery/#v=1.10.2&fn=proxyは)戻って終わりますもしmyObject.handleSomethingをイベントハンドラとして使用したいのであれば、newコールの場合は実用上有利でしょうか?

_.bindAllと似たようなものを$.proxyと書くことはできますか?例えば。

$.proxyAll = function (obj) { 
    for (var attr in obj) if (obj.hasOwnProperty(attr) && $.isFunction(obj[attr])) { 
     obj[attr] = $.proxy(obj[attr], obj); 
    } 
    return obj; 
}; 
+0

あなたのイベントをハンドラにバインドしようとしているので、あなたは 'myObject.handleSomething'によってイベントが処理されるとコンテキストの問題が発生しているようですね。もしそうなら、あなたのイベントデータの一部としてコンテキストを渡すのはなぜですか? –

+0

私はあなたを誤解しているかもしれませんが、それは意味をなさない(イベントデータに 'myObject'コンテキストを取得する方法は?)。私が必要とするのは 'Object.bind()'ですが、IEのためにライブラリを使う必要があります。 underscore.jsとjQueryのパフォーマンスの差はかなり大きく、jQueryの方がはるかに高速です。私の質問の最初の部分は、この速度の違いが一般性の欠如によるものかどうかです。私の質問の2番目の部分は '_.bindAll()'が 'jQuery.proxy()'から直接実装可能かどうかです。 – thebjorn

答えて

5

気になるパフォーマンスを測定してもよろしいですか?

は、このテストケースは、バインドされた機能のパフォーマンスを測定し、一方、テストケースは、結合機能のパフォーマンスを測定しているようだ: http://jsperf.com/bind-vs-jquery-proxy/38

あなたが唯一の有限(比較的小さい)数の結合機能でなければなりませんそれで、パフォーマンスは本当に重要ではありません。それは私には驚きでしたが、バインドされた関数のパフォーマンスを測定すると結果が反転するようです。

また、元のテスト結果はブラウザによって異なります。

+2

良いキャッチ。 (ベンチマークは私のものではありませんでしたが、バインドの実装を調べるときにリンクが見つかりました)。私は利用可能なブラウザのコレクションでベンチマークを実行し、バージョン39を追加しました。ここでネイティブバインドも追加されました。 – thebjorn

+0

ニース。ありがとう!私はネイティブバインドがあるのか​​分からなかった。 – colllin

+0

また、1kのバンプに感謝します! :) – colllin