Neltuosito.itServizi Web Softvision  
 Accesso al Pannello di Controllo :  UserID  Password    Home    Registrazione
 
Servizi per il calcio
  Classifiche Campionati
  Risultati Campionati
Concorsi Pronostici
  Estrazioni Euro Jackpot
  Estrazioni del Lotto
  Risultati SuperEnalotto
  Risultati Totocalcio
  Risultati Totogol
  Risultati Big Match
  Risultati Tris
  Risultati V7
Cucina
Archivio Ricette
  Una Ricetta al Giorno
Vari
Codice Fiscale
  Archivio Barzellette
  Una Barzelletta al Giorno
Calcolo dell'IBAN
Calcolo del Peso Forma
Ricerca CAP
  Calcolo dei Bioritmi
   
Registrazione
Servizi FREE
Assistenza
Suggerimenti
Risorse Web Master
Guida Ajax
  Posizionamento Motori
  Posizionamento e Marketing
  Strategie per i Forum
    

Privacy Policy

Le chiusure

La più semplice definizione di chiusura, e anche una delle meno immediatamente comprensibili per chi non le conosce, è la seguente: una chiusura è una funzione con uno stato ad essa associato. Cosa significa di preciso? Per spiegarlo bisogna fare un passo indietro, e ritornare alle funzioni anonime di cui abbiamo parlato prima (se non ricordate bene cosa sono, tornate indietro a fare un ripasso e poi ritornate qui!). Abbiamo detto che in Javascript le funzioni sono un oggetto di prima classe, e abbiamo infatti visto come sia possibile passare una funzione come argomento ad un'altra funzione. Abbiamo anche affermato che è possibile scrivere funzioni che ritornano funzioni come argomento. Ad esempio il codice

function creaFunzione() {
    var f = function() {return 1};
    return f;
}
var b = creaFunzione();
alert(b());

quando viene eseguito mostra un alert in cui c'è scritto 1. La funzione creaFunzione ritorna una funzione che non fa altro che ritornare 1 (scusate il gioco di parole, ma è proprio cosi, creaFunzione ritorna una funzione che quando viene chiamata ha come valore di ritorno l'intero 1). Tale funzione ritornata da creaFunzione viene salvata dentro la variabile b. Da questo momento in poi b può essere usata come una funzione, infatti la chiamiamo nell'ultima riga del programma di esempio, per ottenere l'argomento di alert.

Fin qui nulla di nuovo. Esistono le funzioni anonime, e come tutte le altre funzioni sono oggetti di prima classe: possono essere utilizzato come argomento, ritornate da altre funzioni, tenute dentro le variabili, e qualunque altra cosa fareste con un numero, una stringa o un array (anch'essi tutti oggetti di prima classe). Ma cosa accade se nel corpo di una funzione anonima c'è un riferimento ad una variabile che è definita al momento della sua creazione nello scopo esterno ad essa? Un esempio chiarirà cosa voglio dire.

function creaFunzione(valore) {
    var f = function() {return valore};
    return f;
}

La variabile valore esiste mentre la funzione creaFunzione viene eseguita, e come potete vedere compare nel corpo della funzione anonima che alla fine restituiamo come valore di ritorno. Ma quando utilizzeremo la funzione anonima creata, creaFunzione non sarà più attiva, dunque cosa contiene la variabile valore quando la funzione anonima viene invocata?. Concentratevi che questo è un passaggio delicato. Ciò che accade è che la funzione anomina create ricorderà il riferimento all'oggetto che aveva la variabile valore al momento in cui la funzione anonima è stata creata. Dunque se scrivo

a = creaFunzione(10);
b = creaFunzione(20);
a(); // ritorna 10
b(); // ritorna 20

Le funzioni a e b ritorneranno ad ogni chiamata rispettivamente 10 e 20! Ecco cosa significa che una chiusura è una funzione con uno stato ad essa associato. La chiusura ricorda tutti i riferimenti a variabili esterne al momento della sua creazione. La cosa interessante è che questo stato che la chiusura si porta appresso può anche essere modificato.

Per esempio è possibile scrivere una funzione che ritorna delle funzioni che contano.

function creaContatore() {
    var c=0;
    return function() {
        return c++;
    }
}

var a = creaContatore();
var b = creaContatore();
a(); /* ritorna 0 */
a(); /* ritorna 1 */
a(); /* ritorna 2 */
b(); /* ritorna 0 */
b(); /* ritorna 1 */
a(); /* ritorna 3 */

Ad ogni chiamata a() e b() ritornano l'intero successivo (partendo da zero), e ricordano dove erano arrivate. Siccome questo non è un corso completo di programmazione funzionale non mi posso spingere oltre, ma provate a immaginare le possibilità... (argh, sembra lo spot della Apple).
 

 

 

 

Softvision - Via Cesare Battisti, 101 - 67051 Avezzano (AQ) - P.IVA 02081660660

Privacy Policy - Cookie Policy