Originariamente inviato da American
ed in questo caso lo scope include anche la funzione whenReady? Altrimenti non mi spiego come faccia a richiamarle ( if (ready), else funcs.push )
Il codice purtroppo crea un po' di confusione. In JavaScript c'è sempre una grossa distinzione tra nome di una funzione e una variabile contenente una funzione.
Fare:
codice:
function miaFunzione () {
// fai qualcosa
}
non è la stessa cosa che fare:
codice:
var miaFunzione = function () {
// fai qualcosa
};
Nel primo caso miaFunzione è il nome di una funzione, nel secondo caso è il nome di una variabile.
Per tornare al tuo esempio… Si tratta di una closures. Segnati quanto segue:
Ogni qualvolta venga creata una funzione B all'interno di una funzione A e B sia accessibile al return di A (entrambe queste condizioni devono essere vere) la funzione A non viene "distrutta" al termine della sua esecuzione, ma viene lasciata aperta (si parla in questo caso di closures). Non tutte le volte che una funzione è annidata all'interno di un altra si verificano le closures. Perché avvenga è necessario che la funzione annidata risulti in un modo o nell'altro accessibile all'esterno, come ad esempio in questo caso:
codice:
function A () {
return function B () {
// fai qualcosa
};
}
oppure:
codice:
var mioOggetto = {};
function A () {
mioOggetto.miaFunzione = function () {
// fai qualcosa
};
}
In entrambi questi casi la funzione annidata risulta accessibile in qualche modo dall'esterno al termine dell'esecuzione della funzione A. Di conseguenza la funzione A resterà aperta fin quando non distruggerai ogni accesso esterno alla funzione interna (closure). Ma annidare una funzione dentro l'altra non comporta di per sé una closure. Ad esempio nel seguente codice non si verificherà una closure, perché non restituisci all'ambiente esterno la funzione annidata (ma ti limiti a utilizzarla):
codice:
function quadratoDellaSomma (a, b) {
function somma (addendo1, addendo2) {
return addendo1 + addendo2;
}
return Math.pow(somma(a, b), 2);
}
Le closures si verificano solo ed esclusivamente con le funzioni, non con gli oggetti in generale (a meno che questi non contengano a loro volta funzioni annidate localmente, ovviamente). Tutto chiaro?
Originariamente inviato da American
Inoltre tali variabili sono tracciabili dall'esterno dello scope, ad esempio dal codice principale?
Assolutissimamente NO. È proprio per non "sporcare" l'ambiente globale che si procede così.