it-swarm.com.ru

Почему переменная JavaScript начинается со знака доллара?

Я довольно часто вижу JavaScript с переменными, которые начинаются со знака доллара. Когда/почему вы выбрали бы префикс переменной таким образом?

(Я не спрашиваю о синтаксисе $('p.foo'), который вы видите в jQuery и других, но о обычных переменных, таких как $name и $order)

978
Ken

Очень распространенное использование в 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, которые имеют другой набор свойств.

1338
jonstjohn

В 1-м, 2-м и -е издание ECMAScript использование имен переменных с префиксом $ явно не поощрялось спецификацией, кроме как в контексте сгенерированного кода:

Знак доллара ($) и подчеркивание (_) разрешены в любом месте идентификатора. Знак доллара предназначен для использования только в механически сгенерированном коде.

Однако в следующей версии ( 5-е издание , которая является текущей) это ограничение было снято, а приведенный выше фрагмент заменен на

Знак доллара ($) и подчеркивание (_) разрешены в любом месте IdentifierName .

Таким образом, знак $ теперь может свободно использоваться в именах переменных. Определенные структуры и библиотеки имеют свои собственные соглашения о значении символа, отмеченные в других ответах здесь.

237
cic

Как уже упоминалось, знак доллара предназначен для использования механически сгенерированным кодом. Однако это соглашение было нарушено некоторыми чрезвычайно популярными библиотеками JavaScript. JQuery, Prototype и MS AJAX (AKA Atlas) все используют этот символ в своих идентификаторах (или в качестве полного идентификатора).

Короче говоря, вы можете использовать $, когда захотите. (Переводчик не будет жаловаться.) Вопрос в том, когда вы хочу использовать это?

Я лично не использую это, но я думаю, что это использование допустимо. Я думаю, что MS AJAX использует его, чтобы показать, что функция является псевдонимом для более подробного вызова.

Например:

var $get = function(id) { return document.getElementById(id); }

Это похоже на разумное соглашение.

57
Benry

В контексте AngularJS префикс $ используется только для идентификаторов в коде платформы. Пользователям фреймворка предписано не использовать его в своих идентификаторах:

Угловые пространства имен $ и $$

Чтобы предотвратить случайные конфликты имен с вашим кодом, Angular ставит префиксы имен открытых объектов с $ и имен частных объектов с $$. Пожалуйста, не используйте префикс $ или $$ в вашем коде.

Источник: https://docs.angularjs.org/api

53
Travis

Я был тем человеком, который создал это соглашение еще в 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. На меня уже смотрело соглашение Nice: уберите несколько символов из вызова $(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( ... );
22
Michael Geary

Стево прав, значение и использование знака сценария доллара (в 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 $$$$$"); }

Все приведенные выше примеры будут работать.

Попробуйте их.

20

Символ $ не имеет особого значения для движка JavaScript. Это просто еще один допустимый символ в имени переменной, например, a-z, A-Z, _, 0-9 и т.д.

7
Stevo

Поскольку _ в начале имени переменной часто используется для обозначения закрытой переменной (или, по крайней мере, одной, предназначенной для сохранения приватности), я считаю, что $ удобен для добавления перед моими краткими псевдонимами библиотек универсального кода.

Например, при использовании jQuery я предпочитаю использовать переменную $J (вместо просто $) и использовать $P при использовании php.js и т.д.

Префикс делает его визуально отличным от других переменных, таких как мои собственные статические переменные, указывая на тот факт, что код является частью той или иной библиотеки, и с меньшей вероятностью будет конфликтовать или путать других, когда они знают соглашение.

Он также не загромождает код (или не требует дополнительной типизации), как и полностью указанное имя, повторяемое для каждого вызова библиотеки.

Мне нравится думать, что это похоже на то, что делают клавиши-модификаторы для расширения возможностей отдельных клавиш.

Но это всего лишь мое собственное соглашение.

2
Brett Zamir

Как я испытал за последние 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 ().

Надеюсь, что это помогло. поэтому, наконец, хочу сказать, что это будет хорошей практикой, но не обязательно.

2
Naga Srinu Kapusetti

Хотя вы можете просто использовать его для добавления префиксов к своим идентификаторам, он должен использоваться для сгенерированного кода, например, для замены токенов в шаблоне.

0
Ryan Abbott

${varname} - это просто соглашение об именах, которое разработчики jQuery используют для различения переменных, содержащих элементы jQuery.

Обычный {varname} используется для хранения общих вещей, таких как тексты и строки. ${varname} содержит элементы, возвращенные из jQuery.

Вы также можете использовать обычный {varname} для хранения элементов jQuery, но, как я уже сказал в начале, это отличает его от простых переменных и делает его намного проще для понимания (представьте, что вы путаете его с простой переменной и ищите все, чтобы понять, что в ней содержится ).

Например :

var $blah = $(this).parents('.blahblah');

Здесь Blah хранит возвращенный элемент jQuery.

Итак, когда кто-то еще увидит $blah в коде, он поймет, что это не просто строка или число, это элемент jQuery.

0
Satyabrata Mishra