Пост Реми Шарпа сбивает с толку, если вы, по моему мнению, не читаете его внимательно. Значение this
никогда не меняется. В приведенном вами примере было 2 варианта использования this
. Как элемент DOM в событии:
$('a').click(function() {
alert(this.tagName);
});
и обернуто как объект jQuery в событии:
$('a').click(function() {
alert($(this).val());
});
Если вы внимательно прочитаете 2 приведенных выше фрагмента, вы заметите, что this
никогда не меняет значения. Это всегда относится к элементу DOM. Разница заключается в том, как он используется.
В jQuery по умолчанию this
относится к элементу DOM (не объекту jQuery), который вызвал событие. Во втором фрагменте кода выше это все еще того же элемента DOM, только он обернут в элемент jQuery, обернув $()
вокруг него. Как и в случае с любым аргументом конструктора jQuery, передача this
в конструктор преобразует его в объект jQuery.
Я думаю, что путаница возникает, когда Реми начинает говорить о плагинах jQuery в той же статье, что и события jQuery. Плагины jQuery - это то, что люди редко пишут и часто используют. При написании плагина jQuery вы работаете в контексте прототипа объекта jQuery. В этом случае вы используете слово this
для обозначения написанного вами плагина. В обычных случаях вы не будете часто писать плагины, так что это гораздо менее распространенный сценарий. Если вы не находитесь в области действия плагина, вы не можете использовать this
для ссылки на объект jQuery.
В языке JavaScript ключевое слово this
относится к текущему экземпляру объекта в JavaScript. При использовании в прототипе JavaScript он ссылается на экземпляр прототипа. В зависимости от браузера, при использовании модели событий не-jquery, this
также ссылается на элемент DOM. Поскольку некоторые браузеры (Internet Explorer) не называют this
элементом DOM в событии, это затрудняет работу с событиями. Чтобы обойти это, jQuery выполняет магию JavaScript, которая всегда заставляет this
ссылаться на элемент DOM, который вызвал событие. Это (одна из многих) причин, чтобы использовать JavaScript-фреймворк вместо собственного.