В соответствии с документацией здесь,
$.proxy()
отсоединяет правильную функцию, если контекст указан как исходный объект.
Однако я этого не понимаю. Первый пример, приведенный на той же странице, объясняет это в строке 43 следующим образом:
/* this === "zombie"; handler unbound after first click */
.on( "click", $.proxy( me.test, me ) )
Все, что я могу понять, это то, что когда я нажимаю первый раз, потому что параметр $.proxy
является функцией me
, а второй параметр me
, он отключает эту ассоциацию после первого щелчка.
Хотя я читаю это так, я не получаю от того, что именно отвязывается от чего?
Когда я нажимаю на кнопку второй раз, он не отображает вывод выше строки, как если бы этот конкретный обработчик onclick
был удален из цепочки. Однако привязка к событию является функцией $.on()
, а не $.proxy()
. Тогда что происходит за сценой.
Чтобы поэкспериментировать с этим поведением, я построил этот простой JSFiddle. Насколько я понимаю, он не должен показывать строку
fun1 : [object HTMLButtonElement] : fun1
на выходе после первого щелчка. Но он продолжает показывать линию. Поэтому я уверен, что это неправильно. Где не так?
Edit
Хорошо, я здесь очень смущен. Так что просто публиковать точные вещи я не понимаю. Точные слова из документации;
Кроме того, jQuery гарантирует, что даже если вы свяжете функцию, возвращенную s >
jQuery.proxy()
, она все равно отменит правильную функцию, если она будет передана оригиналу.Помните, однако, что подсистема привязки событий jQuery присваивает уникальный идентификатор каждой функции обработки событий, чтобы отслеживать ее, когда она используется для указания функции, которая должна быть отключена. Функция, представленная
jQuery.proxy()
, рассматривается как одна функция подсистемой событий, даже если она используется для привязки разных контекстов. Чтобы избежать развязывания неправильного обработчика, используйте уникальное пространство имен событий для связывания и развязывания (например,"click.myproxy1"
), а не задание прокси-функции во время развязывания.
Однако в основном это говорит о подсистеме событий jQuery, и я не понимаю, где именно обрабатывается функциональность unbind the correct function if passed the original
, так как, когда я копаю код $.proxy()
, что все, что я могу заметить в связи с этим, это генерировать и назначая guid, thats it.
Вот код для $.proxy()
из jquery-1.10.2.js:
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
var args, proxy, tmp;
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;
},
Не понимаю, что делает код, разделенный комментариями, отмеченными звездочкой.