Подтвердить что ты не робот

В чем разница между $.proxy() и bind()?

В 2009 году ECMAScript 5 добавил встроенную функцию bind(), которая принимает объект как параметр и возвращает идентичную функцию, в которой this всегда будет ссылаться на объект, который вы передали. (Я не мог найти ничего похожего на ссылку канонической документации.)

Как это отличается от функции jQuery $.proxy()? Пришел ли $.proxy() первым до выхода ECMAScript 5? Есть ли какая-то особая причина в пользу $.proxy(function(){}, this) над function(){}.bind(this)?

4b9b3361

Ответ 1

Изменить

Не обращайте внимания на это сообщение (несмотря на принятый ответ).
Короче говоря, моя собственная ошибка заключалась в том, чтобы делать предположения о контексте вопроса, а не просто искать документы API, и была принята в качестве ответа, прежде чем я смог реализовать свою собственную глупость (делая допущения, не проверяя их) и удалите его.

Ответ Мэтта Уиппла на 100% правильный, и пока я не согласен с его утверждением, что реальные Прокси бесполезны в JS (они были бы фантастическими в некоторых проблемах низкого уровня), остальные его высказывания объективно корректны ( кроме фактических дат для .bind vs .proxy, поскольку .bind был в спецификации за годы до того, как он последовательно высаживался в браузерах).

Ниже мой позор, в запасах для всех, чтобы увидеть...

Не стесняйтесь бросать в него томаты.
Если вы хотите знать, почему я ответил так, как я это сделал, прочитайте комментарии ниже.


Разница между $({}).proxy() и func.bind({}) заключается в том, что прокси является свободным соединением. Вы можете отсоединиться в любое время.

Вот для чего нужны прокси. Невидимый интерфейс между тем, что вы хотите сделать, и тем, что на самом деле это сделает.

Для записи также есть $.bind(), который не является прокси. То есть он полностью привязан к this, так же, как func.bind(), а не к внедрению медиаторной системы для присоединения и отстранения контекста от функций at-will.

Ответ 2

proxy пришел первым, и вы, вероятно, предпочитаете bind, поскольку это стандарт. Способ, которым они называются, немного отличается (из-за того, что он привязан к Function.prototype, а просто является функцией), но их поведение одинаковое.

Здесь есть довольно хорошая публикация: jQuery.proxy() использование, которая заканчивается этим советом.

Ответ 3

$.proxy пришел первым. Ниже приведен простой способ сохранения определенного контекста при вызове функции

var myProxy = (function(context,fn){
  return function(){
      fn.call(context);
  }
})( myContext, myFn );

Вы можете легко использовать это, прежде чем он выйдет из jQuery.

Ответ прост: bind является официальным. Используйте bind - если он действительно поддерживается в браузерах, который требуется для запуска script

Ответ 4

От Подчеркнуть привязку vs jQuery.proxy vs Native bind

В дополнение к тому, что уже упоминалось, существует еще одна разница между $.proxy() и .bind. Методы, связанные с $.proxy, возвращают одну и ту же ссылку, если она вызвана несколько раз; jQuery кэширует функции, связанные с объектом.

jsFiddle

Ответ 5

Вот тест, который вы можете попробовать для сравнения производительности.

http://jsperf.com/bind-vs-jquery-proxy/5

В это время, октябрь 2014 года. Производительность варьируется как сумасшедшая между браузерами. Взаимодействие с IE 11 быстрее.

Тем не менее, для всех трех браузеров, с которыми я тестировал, встроенный bind out proform jquery proform. И поскольку bind() является стандартным, я бы предложил придерживаться его, если это возможно.