Fui la persona que originó esta convención en 2006 y la promocioné 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 el $
, todavía tendríamos dos nombres de variables diferentes aquí, email
y email_field
. Eso es bastante bueno allí mismo. ¿Por qué tendríamos que agregar $
uno a 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 son JavaScript idiomático y field
realmente no tiene sentido para un elemento DOM. Pero seguí la misma idea.
Intenté 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 para ello:
// 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 bits de código, email
está el objeto jQuery y emailElement
es el elemento DOM, pero en el otro, email
es el elemento DOM y emailJQ
es el objeto jQuery.
No hubo consistencia y seguí mezclándolos. Además, era un poco molesto seguir teniendo que inventar dos nombres diferentes para la misma cosa: uno para el objeto jQuery y otro para el elemento DOM correspondiente. Además email
, emailElement
y emailJQ
, seguí probando otras variaciones también.
Entonces noté un patrón común:
var email = $("#email");
var emailJQ = $(email);
Como JavaScript trata $
simplemente como otra letra para los nombres, y dado que siempre recibí un objeto jQuery de una $(whatever)
llamada, el patrón finalmente se me ocurrió . Podría tomar una $(...)
llamada y simplemente eliminar algunos caracteres, y aparecería con un nombre bastante agradable:
$("#email")
$(email)
Strikeout no es perfecto, pero puede tener la idea: con algunos caracteres eliminados, ambas líneas terminan pareciendo:
$email
Fue entonces cuando me di cuenta de que no necesitaba inventar una convención como emailElement
o emailJQ
. Ya había una buena convención mirándome: sacar 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 tuve que inventar dos nombres diferentes todo el tiempo, pero podrí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( ... );