Я был тем человеком, который создал это соглашение еще в 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)
вызова, шаблон, наконец, меня осенило. Я мог бы взять $(...)
вызов и просто удалить некоторые символы, и это придумало бы довольно красивое имя:
$("#email")
$(email)
Зачеркнутый не идеален, но вы можете понять, что при удалении некоторых символов обе эти строки выглядят так:
$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( ... );