Я довольно часто вижу JavaScript с переменными, которые начинаются со знака доллара. Когда / почему вы выбрали такой префикс для переменной?
(Я спрашиваю не о синтаксисе $('p.foo'), который вы видите в jQuery и других, а о обычных переменных, таких как $name и $order)
Некоторые языки требуют этого, например PHP или Perl - я предполагаю, что разработчик не помнил, что это не нужно в javascript.
или они не хотели отказываться от этой привычки. Скорее всего, это правильный ответ, поскольку многие разработчики, которые собирают свои собственные веб-страницы, делают это с помощью PHP и javascript.
@DonaldDuck Я думаю, ваши дубликаты могут быть неправильными - это на 7 месяцев старше вашей ссылки
@Ken Согласно этот ответ, важен не возраст, а то, насколько хороши ответы. Я лично считаю, что ответы на другой вопрос лучше, поэтому я проголосовал за то, чтобы закрыть этот как дубликат. Если вы считаете, что ответы на этот вопрос лучше, вы можете проголосовать за то, чтобы закрыть второй как дубликат.
Как один из тех парней, которые «взламывают» веб-страницы, я использую переменную $ в javascript, потому что я выучил php задолго до того, как выучил javascript. И дело не в том, чтобы отказаться от привычки, для меня речь идет о том, чтобы мой JS-код был легко читаемым. Если я смотрю на код, в котором не используются знаки доллара, мой мозг обрабатывает его намного медленнее. Вкратце, это делает мой код красивым, читаемым и согласованным между двумя языками, которые я использую все время.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хотя вы можете просто использовать его для префикса ваших идентификаторов, он должен использоваться для сгенерированного кода, например, для замены токенов в шаблоне.
Верно шесть лет назад, но не сейчас.
В 1-м, 2-м и 3-е издание ECMAScript использование имен переменных с префиксом $ явно не рекомендовалось спецификацией, за исключением контекста автоматически сгенерированного кода:
The dollar sign (
$) and the underscore (_) are permitted anywhere in an identifier. The dollar sign is intended for use only in mechanically generated code.
Однако в следующей версии (текущая 5-е издание) это ограничение было снято, а приведенный выше отрывок заменен на
The dollar sign (
$) and the underscore (_) are permitted anywhere in an IdentifierName.
Таким образом, теперь знак $ можно свободно использовать в именах переменных. Некоторые фреймворки и библиотеки имеют свои собственные соглашения о значении символа, отмеченные в других ответах здесь.
Хотя это может быть правдой, действительно ли это помогает ответить на вопрос ОП? Принятый в настоящее время ответ лучше - когда начинающий программист JS видит $variable, вероятно, потому, что он содержит весь объект jQuery.
@rinogo Он отвечает на вопрос с некоторой абсолютной правдой, которая не зависит от предположений об используемых библиотеках.
Что в этом контексте означает механически сгенерированный код?
@yoyo_fun: код, который создается компьютером, а не написан человеком.
@cic, как можно применить этот сценарий? Зачем компьютеру генерировать код javascript?
@yoyo_fun: github.com/jashkenas/coffeescript/wiki/…
«Он отвечает на вопрос с некоторой абсолютной правдой». На самом деле правда заключалась в том, что разработчики полностью игнорировали это замечание из спецификации языка ... и, вероятно, до сих пор игнорируют. :)
Как уже упоминалось, знак доллара предназначен для использования механически сгенерированным кодом. Однако это соглашение было нарушено некоторыми широко популярными библиотеками JavaScript. JQuery, Prototype и MS AJAX (AKA Atlas) используют этот символ в своих идентификаторах (или в качестве всего идентификатора).
Короче говоря, вы можете использовать $, когда захотите. (Интерпретатор не будет жаловаться.) Вопрос в том, когда вы хочу его использовать?
Лично я им не пользуюсь, но считаю, что использование допустимо. Я думаю, что MS AJAX использует его для обозначения того, что функция является псевдонимом для более подробного вызова.
Например:
var $get = function(id) { return document.getElementById(id); }
Это кажется разумным условием.
JQuery НЕ использует это в идентификаторах, причина того, что $ .X существует, просто в том, что нужно вводить меньше - jQuery.X идентичен, на самом деле $ .X является псевдонимом пространства имен для jQuery.X - каждая функциональность jQuery находится в пределах jQuery-ns, а не $
@specializt, как я сказал 5 лет назад, «или как целый идентификатор». Под идентификатором я подразумеваю стандартное определение CS, которое представляет собой лексический токен, который не является ключевым словом в языке. В этом случае $ и jQuery - это два разных идентификатора, которые ссылаются на одно и то же значение. Но тем не менее они оба являются идентификаторами.
Очень часто в jQuery используется для различения объектов 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
Я считаю, что это очень полезно при написании кода jQuery и упрощает просмотр объектов jQuery, которые имеют другой набор свойств.
Это НАСТОЯЩАЯ венгерская нотация. Он передает информацию о том, что хранится в переменной, помимо того, что делает имя переменной. А ++ снова бы Венгрия.
Я бы хотел, чтобы документация jquery также использовала эту нотацию ... Это действительно очень полезно.
@Artemis Я освоил венгерский язык почти 20 лет назад и никогда не мог перестать его использовать. На протяжении многих лет многие люди выражали большое недовольство тем, что я использую его, но он настолько полезен, что я не могу понять почему.
@Artemis Процитируем с другой страницы: «Однако это использование может быть, вероятно, Приложения на венгерском языке, поскольку переменная« представляет объект jQuery », а не System Hungarian (который обычно считается« плохим »или указывает на то, КАК переменная будет храниться система)."
Недурно за $. Но следует избегать подчеркивания в именах переменных, обычные JS-переменные должны использовать camelCase. email_fields -> emailField. Единственный допустимый вариант использования _ - это префикс для частных / защищенных свойств.
@cschuff Вот это утверждение ... Я предпочитаю подчеркивание для всех локальных переменных и резервирую верблюжий регистр для свойств объектов-прототипов.
@cschuff JS - это не язык, созданный с типизированными ограничениями на то, как вы выбираете писать свои методы или имена переменных, это даже не должно быть предложением, поскольку это скорее индивидуальное и / или командное решение ... Это, кроме я, предпочитает подчеркивание или змейка, потому что я кодирую также для удобочитаемости и легче читать «ротация_куррент_форма_наме», чем «ротацияКуррентФормы», по этому поводу тоже проводится исследование.
Подчеркивание в качестве разделителя облегчает мне чтение собственного кода. В чем причина беспокойства о них? Если бы это была веская причина, я бы прекратил это делать. С другой стороны, я НЕНАВИЖУ подчеркивание, которое я часто вижу выполненным для локальных или частных атрибутов класса, а что нет. Так что делать? Кажется, что верблюжий регистр уступает место строчным буквам. Я просто не могу понять условности.
Символ $ не имеет особого значения для движка JavaScript. Это просто еще один допустимый символ в имени переменной, например a-z, A-Z, _, 0-9 и т. д.
правда, но не то, о чем спрашивали. Я пришел сюда, чтобы понять, почему он использовался, и, похоже, случай, когда я это видел, заключался в том, чтобы различать var, содержащую объект jquery, между var, содержащим объект dom.
@rtpHarry не ты задавал вопрос, и на вопрос «почему» здесь дан адекватный ответ. Это не имеет ничего общего с JQuery, как также было указано в вопросе. На самом деле, я думаю, что приведенный выше ответ лучше всего подходит к вопросу - иногда, если вы хотите понять что-то, вам нужен самый четкий ответ - $ не имеет особого значения в JavaScript. Период.
Я считаю, что некоторые ... кхм ... люди хотят добавлять знаки доллара к именам переменных, чтобы все выглядело более угловатым.
Стево прав, значение и использование знака доллара в скрипте (в Javascript и платформе jQuery, но не в PHP) полностью семантично. $ - это символ, который можно использовать как часть имени идентификатора. Кроме того, знак доллара - это, пожалуй, не самая «странная» вещь, с которой вы можете столкнуться в Javascript. Вот несколько примеров правильных имен идентификаторов:
var _ = function() { alert("hello from _"); }
var \u0024 = function() { alert("hello from $ defined as u0024"); }
var Ø = function() { alert("hello from Ø"); }
var $$$$$ = function() { alert("hello from $$$$$"); }
Все приведенные выше примеры будут работать.
Попробовать их.
Причина, по которой я иногда использую соглашения об именах php с переменными javascript: При проверке ввода я хочу запускать одни и те же алгоритмы на стороне клиента, и на стороне сервера. Я действительно хочу, чтобы обе стороны кода выглядели как можно более похожими, чтобы упростить обслуживание. Использование знаков доллара в именах переменных упрощает эту задачу.
(Кроме того, некоторые разумные вспомогательные функции помогают сделать код похожим, например, обертывание поиска входных значений, не-объектно-ориентированные версии strlen, substr и т. д., Хотя это все еще требует некоторой ручной настройки.)
Если вы видите знак доллара ($) или двойной знак доллара ($$) и вам интересно, что это означает в структуре прототипа, вот ваш ответ:
$$('div');
// -> all DIVs in the document. Same as document.getElementsByTagName('div')!
$$('#contents');
// -> same as $('contents'), only it returns an array anyway (even though IDs must be unique within a document).
$$('li.faux');
// -> all LI elements with class 'faux'
Источник:
http://www.prototypejs.org/api/utility/dollar-dollar
В ОП прямо говорится, что он не спрашивает об этой форме префикса доллара.
Угловой использует для свойств, созданных платформой. Думаю, они руководствуются (ныне несуществующей) подсказкой, предоставленной ECMA-262 3.0.
В контексте AngularJS префикс $ используется только для идентификаторов в коде фреймворка. Пользователям фреймворка рекомендуется не использовать его в собственных идентификаторах:
Angular Namespaces
$and$$To prevent accidental name collisions with your code, Angular prefixes names of public objects with
$and names of private objects with$$. Please do not use the$or$$prefix in your code.
Источник: https://docs.angularjs.org/api
$ используется, чтобы ОТЛИЧИТЬ общие переменные от переменных jquery в случае обычных переменных. позвольте вам разместить заказ в FLIPKART, тогда, если порядок является переменной, показывающей вам строковый вывод, тогда он называется просто, как «порядок», но если мы щелкнем по размещению заказа, тогда будет возвращен объект, который будет обозначен символом $ как «$ порядок », чтобы программист мог вырезать переменные javascript и переменные jquery во всем коде.
Поскольку _ в начале имени переменной часто используется для обозначения частной переменной (или, по крайней мере, той, которая должна оставаться частной), я считаю, что $ удобен для добавления перед моими собственными краткими псевдонимами в библиотеки общего кода.
Например, при использовании jQuery я предпочитаю использовать переменную $J (вместо просто $) и использовать $P при использовании php.js и т. д.
Префикс делает его визуально отличным от других переменных, таких как мои собственные статические переменные, подсказывая мне тот факт, что код является частью той или иной библиотеки и с меньшей вероятностью будет конфликтовать или сбивать с толку других, когда они узнают соглашение.
Он также не загромождает код (и не требует дополнительного набора текста), как полностью указанное имя, повторяющееся при каждом вызове библиотеки.
Мне нравится думать об этом как о том, что делают клавиши-модификаторы для расширения возможностей одиночных клавиш.
Но это всего лишь мое собственное соглашение.
${varname} - это просто соглашение об именах, которое разработчики jQuery используют для различения переменных, содержащих элементы jQuery.
Обычный {varname} используется для хранения общих вещей, таких как тексты и строки.
${varname} содержит элементы, возвращенные из jQuery.
Вы также можете использовать простой {varname} для хранения элементов jQuery, но, как я сказал в начале, это отличает его от простых переменных и упрощает понимание (представьте, что путаете его с простой переменной и ищите повсюду, чтобы понять, что в ней содержится ).
Например :
var $blah = $(this).parents('.blahblah');
Здесь blah хранит возвращенный элемент jQuery.
Итак, когда кто-то другой увидит $blah в коде, он поймет, что это не просто строка или число, это элемент jQuery.
Вы только что перефразировали принятый ответ 6 лет назад.
Полагаю, это не делает ответ «некачественным».
Как я испытал последние 4 года, это позволит кому-нибудь легко определить, указывает ли переменная на значение / объект или на элемент DOM, обернутый jQuery.
Ex:
var name = 'jQuery';
var lib = {name:'jQuery',version:1.6};
var $dataDiv = $('#myDataDiv');в приведенном выше примере, когда я вижу переменную «$ dataDiv», я могу легко сказать, что эта переменная указывает на элемент DOM, завернутый в jQuery (в данном случае это div). а также я могу вызвать все методы jQuery без повторной упаковки объекта, например $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () вместо $ ($ dataDiv) .append ().
Надеюсь, это поможет. Итак, наконец, хочу сказать, что следовать этому будет хорошей практикой, но не обязательной.
Действительный идентификатор JavaScript должен начинаться с буквы, подчеркивание (_) или знак доллара ($); последующие символы также могут быть цифрами (0-9). Поскольку JavaScript чувствителен к регистру, письма включите символы от "A" до "Z" (прописные) и символы от «a» до «z» (строчные буквы).
Подробности:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables
Вопрос был не в том, «Может ли переменная Javascript начинаться с символа $?», А в том, «Почему ...». the OP искал причину использовать такое соглашение об именах.
Я был человеком, который создал эту конвенцию еще в 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( ... );
Вероятно, это привычка, взятая из программирования на Perl. (изменить: или PHP)