Nelle funzioni JavaScript sono oggetti di prima classe. Ciò significa che puoi passare le funzioni come parametri a una funzione o trattarle come variabili in generale.
Diciamo che stiamo parlando di una funzione hello
,
function hello() {
alert('yo');
}
Quando abbiamo semplicemente scriviamo
hello
ci riferiamo alla funzione che non esegue il suo contenuto. Ma quando si aggiungono le parentesi ()
dopo il nome della funzione,
hello()
poi in realtà stiamo chiamando la funzione che avvisa "yo" sullo schermo.
Il metodo bind
in jQuery accetta il tipo di evento (stringa) e una funzione come argomenti. Nel tuo esempio, stai passando il tipo - "clic" e la funzione reale come argomento.
Hai visto Inception? Considera questo esempio forzato che potrebbe rendere le cose più chiare. Poiché le funzioni sono oggetti di prima classe in JavaScript, possiamo passare e restituire una funzione dall'interno di una funzione. Creiamo quindi una funzione che restituisce una funzione quando viene invocato e la funzione restituita restituisce anche un'altra funzione quando viene richiamata.
function reality() {
return function() {
return function() {
alert('in a Limbo');
}
};
}
Qui reality
è una funzione, reality()
è una funzione, e reality()()
è una funzione pure. Tuttavia, reality()()()
non è una funzione, ma semplicemente undefined
in quanto non restituiamo una funzione (non restituiamo nulla) dalla funzione più interna.
Quindi, per l'esempio di funzione reality
, è possibile avere passato uno dei seguenti collegamenti a jQuery.
$('#foo').bind('click', reality);
$('#foo').bind('click', reality());
$('#foo').bind('click', reality()());
Stranamente, che ha fatto a chiarire le cose. –
Yay, ora detengo il record per l'utilizzo della "funzione" il maggior numero di volte su tutte le risposte SO - 27. – Anurag
+1 per riferimento Inception (e per una buona spiegazione, ovviamente) – delnan