¿Por qué una variable de JavaScript comenzaría con un signo de dólar? [duplicar]
Muy a menudo veo JavaScript con variables que comienzan con un signo de dólar. ¿Cuándo y por qué elegirías anteponer una variable de esta manera?
(No estoy preguntando sobre $('p.foo')
la sintaxis que ves en jQuery y otros, sino sobre variables normales como $name
y $order
)
Un uso muy común en jQuery es distinguir los objetos jQuery almacenados en variables de otras variables.
Por ejemplo, definiría:
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
Considero que esto es muy útil para escribir código jQuery y facilita ver los objetos jQuery que tienen un conjunto diferente de propiedades.
En la primera, segunda y tercera edición de ECMAScript , la especificación desaconsejaba explícitamente el uso de nombres de variables con prefijo $, excepto en el contexto del código generado automáticamente:
El signo de dólar (
$
) y el guión bajo (_
) están permitidos en cualquier parte de un identificador. El signo de dólar está diseñado para usarse únicamente en código generado mecánicamente.
Sin embargo, en la siguiente versión (la quinta edición , que es la actual), esta restricción se eliminó y el pasaje anterior se reemplazó con
El signo de dólar (
$
) y el guión bajo (_
) están permitidos en cualquier parte de un IdentifierName .
Como tal, el signo $ ahora se puede utilizar libremente en nombres de variables. Ciertos marcos y bibliotecas tienen sus propias convenciones sobre el significado del símbolo, como se indica en otras respuestas aquí.
Como otros han mencionado, el signo de dólar está destinado a ser utilizado mediante código generado mecánicamente. Sin embargo, algunas bibliotecas de JavaScript muy populares han roto esa convención. JQuery, Prototype y MS AJAX (AKA Atlas) usan este carácter en sus identificadores (o como un identificador completo).
En resumen, puedes usarlo $
cuando quieras. (El intérprete no se quejará.) La pregunta es ¿cuándo quiere usarlo ?
Yo personalmente no lo uso, pero creo que es válido su uso. Creo que MS AJAX lo usa para indicar que una función es un alias para alguna llamada más detallada.
Por ejemplo:
var $get = function(id) { return document.getElementById(id); }
Parece una convención razonable.
Yo fui la persona que originó esta convención en 2006 y la promovió en la lista de correo de jQuery, así que permítanme compartir algo de la historia y la motivación en torno a ella.
La respuesta aceptada da este ejemplo:
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
Pero eso realmente no lo ilustra bien. Incluso sin $
, todavía tendríamos dos nombres de variables diferentes aquí, email
y email_field
. Eso está muy bien ahí mismo. ¿Por qué necesitaríamos incluir uno $
en uno de los nombres cuando ya tenemos dos nombres diferentes?
En realidad, no lo habría usado email_field
aquí por dos razones: names_with_underscores
no es JavaScript idiomático y field
realmente no tiene sentido para un elemento DOM. Pero seguí la misma idea.
Probé algunas cosas diferentes, entre ellas algo muy similar al ejemplo:
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
(Por supuesto, un objeto jQuery puede tener más de un elemento DOM, pero el código en el que estaba trabajando tenía muchos id
selectores, por lo que en esos casos había una correspondencia 1:1).
Tuve otro caso en el que una función recibió un elemento DOM como parámetro y también necesitaba un objeto 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
}
Bueno, ¡eso es un poco confuso! En uno de mis fragmentos de código, email
está el objeto jQuery y emailElement
es el elemento DOM, pero en el otro, email
está el elemento DOM y emailJQ
es el objeto jQuery.
No había consistencia y seguí mezclándolos. Además, era un poco molesto tener que inventar dos nombres diferentes para lo mismo: uno para el objeto jQuery y otro para el elemento DOM correspondiente. Además email
, emailElement
y emailJQ
también seguí probando otras variaciones.
Entonces noté un patrón común:
var email = $("#email");
var emailJQ = $(email);
Dado que JavaScript trata $
simplemente como otra letra más para los nombres, y dado que siempre recibía un objeto jQuery de una $(whatever)
llamada, finalmente me di cuenta del patrón. Podría atender una $(...)
llamada y simplemente eliminar algunos caracteres, y obtendría un nombre bastante bonito:
$
("#email")$
(email)
El tachado no es perfecto, pero puede que te hagas una idea: con algunos caracteres eliminados, ambas líneas terminan luciendo así:
$email
Fue entonces cuando me di cuenta de que no necesitaba inventar una convención como emailElement
o emailJQ
. Ya había una bonita convención mirándome: saca algunos caracteres de una $(whatever)
llamada y se convierte en $whatever
.
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
y:
// 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!
}
Así que no tenía que inventar dos nombres diferentes todo el tiempo, sino que podía usar el mismo nombre con o sin $
prefijo. Y el $
prefijo fue un buen recordatorio de que estaba tratando con un objeto jQuery:
$('#email').click( ... );
o:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
En el contexto de AngularJS, el $
prefijo se usa solo para identificadores en el código del marco. Se indica a los usuarios del marco que no lo utilicen en sus propios identificadores:
Espacios de nombres angulares
$
y$$
Para evitar colisiones accidentales de nombres con su código, Angular antepone nombres de objetos públicos con
$
y nombres de objetos privados con$$
. No utilice el prefijo$
o$$
en su código.
Fuente: https://docs.angularjs.org/api