cosa significa quando una funzione annidata non è assegnata a una var?

0

Sto facendo riferimento a questo link sulle chiusure: link

Questo è specificamente su javascript. Nella seconda risposta con 956 voti, l'autore restituisce la funzione nidificata "sayAlert" dopo averla assegnata alla parola chiave var come mostrato di seguito. (Esempio 3)

function say667() {
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() { alert(num); }
num++;
return sayAlert;
}
var sayNumber = say667();
sayNumber(); // alerts 667

Tuttavia nel prossimo esempio (Esempio 4), l'autore assegna le seguenti funzioni, "gAlertNumber", "gIncreaseNumber" e "gSetNumber", senza la parola chiave var. Quindi l'autore è in grado di chiamare le funzioni nidificate come segue.

function setupSomeGlobals() {
// Local variable that ends up within closure
var num = 666;
// Store some references to functions as global variables
gAlertNumber = function() { alert(num); }
gIncreaseNumber = function() { num++; }
gSetNumber = function(x) { num = x; }
}

setupSomeGlobals();
gIncreaseNumber();
gAlertNumber(); // 667
gSetNumber(5);
gAlertNumber(); // 5

var oldAlert = gAlertNumber;

setupSomeGlobals();
gAlertNumber(); // 666

oldAlert() // 5

Ho provato ad aggiungere la parola chiave var all'elemosina di ogni funzione nidificata, ma nella mia console restituisce un errore. Quindi presumo ci sia una differenza tra i due. Ma non so come si chiama questa tattica e perché funzioni ...

    
posta user3029001 05.07.2014 - 01:00
fonte

1 risposta

3

Questo non è solo per le funzioni - questo è il modo in cui JavaScript generalmente tratta i compiti. Quando si utilizza la parola chiave var , la variabile viene assegnata nell'ambito corrente. Quando non lo usi, la variabile viene assegnata all'ambito globale (l'oggetto window nei browser). Ciò significa che gSetNumber = ... è uguale a window.gSetNumber = ... (supponendo che il codice sia eseguito in un browser) e gSetNumber(5); è uguale a window.gSetNumber(5); . Poiché l'oggetto window è accessibile da qualsiasi parte, quindi gSetNumber . sayAlert , d'altra parte, è stato dichiarato con la parola chiave var , quindi appartiene all'ambito locale in cui è dichiarato e accessibile solo da lì.

Si noti che mentre num è anche una variabile locale dichiarata con la parola chiave var , gAlertNumber , gIncreaseNumber e gSetNumber possono essere utilizzati per accedervi indirettamente da qualsiasi luogo poiché la loro chiusura si chiude sull'ambito locale dove num è dichiarato ma la funzione stessa è assegnata a variabili globali.

    
risposta data 05.07.2014 - 01:37
fonte

Leggi altre domande sui tag