В чем разница между $.proxy() и bind()?
В 2009 году ECMAScript 5 добавил встроенную функцию bind()
, которая принимает объект как параметр и возвращает идентичную функцию, в которой this
всегда будет ссылаться на объект, который вы передали. (Я не мог найти ничего похожего на ссылку канонической документации.)
Как это отличается от функции jQuery $.proxy()
? Пришел ли $.proxy()
первым до выхода ECMAScript 5? Есть ли какая-то особая причина в пользу $.proxy(function(){}, this)
над function(){}.bind(this)
?
Ответы
Ответ 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() является стандартным, я бы предложил придерживаться его, если это возможно.