Я был тем человеком, который создал это соглашение еще в 2006 году и продвигал его в раннем списке рассылки jQuery, поэтому позвольте мне поделиться некоторыми историями и мотивами вокруг него.
Принятый ответ дает такой пример:
var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself
Но это не очень хорошо иллюстрирует это. Даже без $
у нас все равно было бы два разных имени переменных: email
и email_field
. Это очень хорошо, прямо там. Зачем нам нужно добавлять $
в одно из имен, если у нас уже есть два разных имени?
На самом деле, я бы не использовал здесь email_field
по двум причинам: names_with_underscores
не является идиоматическим JavaScript, и field
не имеет смысла для элемента DOM. Но я придерживался той же идеи.
Я пробовал несколько разных вещей, среди них что-то очень похожее на пример:
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
(Конечно, объект jQuery может иметь более одного элемента DOM, но код, над которым я работал, имел много селекторов id
, поэтому в этих случаях имелось соответствие 1: 1.)
У меня был другой случай, когда функция получила элемент DOM в качестве параметра, а также для него был нужен объект jQuery:
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var emailJQ = $(email);
// Now email is the DOM element and emailJQ is a jQuery object for it
}
Ну, это немного сбивает с толку! В одном из моих кусочков кода email
- это объект jQuery, emailElement
- это элемент DOM, но в другом email
- это элемент DOM, а emailJQ
- это объект jQuery.
Не было последовательности, и я продолжал смешивать их. Кроме того, было немного неприятно продолжать составлять два разных имени для одной и той же вещи: одно для объекта jQuery, а другое для соответствующего элемента DOM. Помимо email
, emailElement
и emailJQ
, я продолжал пробовать и другие варианты.
Тогда я заметил общую закономерность:
var email = $("#email");
var emailJQ = $(email);
Поскольку JavaScript обрабатывает $
как просто еще одну букву для имен, и так как я всегда возвращал объект jQuery после вызова $(whatever)
, шаблон, наконец, меня осенило. Я мог бы взять вызов $(...)
и просто удалить несколько символов, и у меня получилось бы довольно красивое имя:
$<del>("#</del>email<del>")</del></code>
<code>$<del>(</del>email<del>)</del>
Зачеркнутый не идеален, но вы можете понять: при удалении некоторых символов обе эти строки выглядят так:
$email
Именно тогда я понял, что мне не нужно составлять соглашение, подобное emailElement
или emailJQ
. На меня уже смотрело приятное соглашение: убери несколько символов из вызова $(whatever)
, и оно превратится в $whatever
.
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
и
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var $email = $(email);
// $email is the jQuery object and email is the DOM object
// Same names as in the code above. Yay!
}
Так что мне не приходилось все время составлять два разных имени, я мог просто использовать одно и то же имя с префиксом $
или без него. И префикс $
был хорошим напоминанием, что я имел дело с объектом jQuery:
$('#email').click( ... );
или
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );