Ho la seguente funzione makeStopwatch
che sto cercando di lavorare attraverso per capire meglio javascript chiusure:Come accedere alle variabili in un altro ambito all'interno di una funzione usando la chiusura in javascript?
var makeStopwatch = function() {
var elapsed = 0;
var stopwatch = function() {
return elapsed;
};
var increase = function() {
elapsed++;
};
setInterval(increase, 1000);
return stopwatch;
};
var stopwatch1 = makeStopwatch();
var stopwatch2 = makeStopwatch();
console.log(stopwatch1());
console.log(stopwatch2());
Quando ho console.log
le chiamate stopwatch1
e stopwatch2
ottengo 0
tornati ogni volta rispettivamente.
Come ho capito la funzionalità prevista di makeStopwatch
la variabile elapsed
sarebbe 0
se restituita dalla funzione interna stopwatch
. La funzione interna increase
incrementa la variabile elapsed
. Quindi setInterval
chiama increase
dopo un ritardo di 1 secondo. Infine, stopwatch
viene restituito di nuovo questa volta con il valore aggiornato che dovrebbe essere 1
.
Ma questo non funziona perché all'interno makeStopwatch
, l'interno stopwatch
, increase
, e setInterval
funzioni sono tutti in ambiti indipendenti l'uno dall'altro?
Come posso rivedere questo lavoro se ho capito bene in modo che elapsed
viene incrementato e tale valore è chiuso più e salvato in modo che quando assegno makeStopwatch
alla variabile stopwatch1
e chiamo stopwatch1
viene restituito il valore aggiornato?
Il tuo codice funziona. Inoltre, CodeSchool? (Ho inserito il tuo codice esattamente come ce l'hai nella console. Esegui 'console.log (stopwatch1())' più volte.) – ChadF
Il codice come postato registrerà sempre 0 per entrambi, poiché console.log si verificherà entro 1 secondo del cronometro che si sta creando. Prova a racchiudere le due righe inferiori in un 'setTimeout (console.log (stopwatch1()), 2000);' 'setTimeout (console.log (stopwatch2()), 4000);' ad esempio per vedere che i cronometri sono effettivamente " correndo " –
Immagino di essere confuso perché guardando il corpo della funzione" aumenta "e come" trascorso "è incrementato, oltre a prendere in considerazione ciò che fa un cronometro reale, mi aspetto che console.logs mostra che il cronometro sta davvero contando verso l'alto. – phizzy