Ero la persona che ha dato origine a questa convenzione nel 2006 e l'ho promossa nella prima mailing list di jQuery, quindi vorrei condividere un po 'della storia e della motivazione che la circondano.
La risposta accettata fornisce questo esempio:
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
Ma questo non lo illustra davvero bene. Anche senza il $
, avremmo comunque due nomi di variabili differenti qui email
e email_field
. Va molto bene proprio lì. Perché dovremmo aggiungere a $
uno dei nomi quando abbiamo già due nomi diversi?
In realtà, non avrei usato email_field
qui per due motivi: names_with_underscores
non sono JavaScript idiomatico e field
non ha davvero senso per un elemento DOM. Ma ho seguito la stessa idea.
Ho provato alcune cose diverse, tra cui qualcosa di molto simile all'esempio:
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
(Naturalmente un oggetto jQuery può avere più di un elemento DOM, ma il codice su cui stavo lavorando aveva molti id
selettori, quindi in quei casi c'era una corrispondenza 1: 1.)
Ho avuto un altro caso in cui una funzione ha ricevuto un elemento DOM come parametro e ha anche bisogno di un oggetto jQuery per esso:
// 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
}
Bene, questo è un po 'confuso! In uno dei miei bit di codice, email
è l'oggetto jQuery ed emailElement
è l'elemento DOM, ma nell'altro email
è l'elemento DOM ed emailJQ
è l'oggetto jQuery.
Non c'era coerenza e ho continuato a mescolarli. Inoltre, è stato un po 'fastidioso dover continuare a creare due nomi diversi per la stessa cosa: uno per l'oggetto jQuery e un altro per l'elemento DOM corrispondente. Inoltre email
, emailElement
e emailJQ
, ho continuato a provare anche altre varianti.
Poi ho notato uno schema comune:
var email = $("#email");
var emailJQ = $(email);
Dato che JavaScript tratta $
semplicemente un'altra lettera per i nomi e dato che da una $(whatever)
chiamata ho sempre ricevuto un oggetto jQuery , il modello mi è finalmente apparso. Potrei rispondere a una $(...)
chiamata e rimuovere solo alcuni caratteri, e sarebbe venuto fuori con un bel nome:
$("#email")
$(email)
Strikeout non è perfetto, ma potresti avere l'idea: con alcuni caratteri eliminati, entrambe le linee finiscono per apparire come:
$email
Fu allora che mi resi conto che non avevo bisogno di inventare una convention come emailElement
o emailJQ
. C'era già una simpatica convention che mi fissava: prendi alcuni personaggi da una $(whatever)
chiamata e si trasforma in $whatever
.
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
e:
// 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!
}
Quindi non ho dovuto inventarmi sempre due nomi diversi, ma potevo semplicemente usare lo stesso nome con o senza $
prefisso. E il $
prefisso mi ha ricordato che avevo a che fare con un oggetto jQuery:
$('#email').click( ... );
o:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );