Con var
si dispone di un insieme di funzioni, e solo uno condiviso vincolante per tutte le vostre iterazioni del ciclo - cioè la i
in ogni callback setTimeout significa stesso variabile che finalmente è uguale a 6 dopo il ciclo l'iterazione finisce.
Con let
si ha un campo di applicazione blocco e quando viene utilizzato nel ciclo for
si ottiene un nuovo vincolante per ogni iterazione - ossia la i
in ogni callback setTimeout mezzi un diverso variabile, ciascuno dei quali ha un valore diverso : il primo è 0, il prossimo è 1 ecc
Quindi questo:
(function timer() {
for (let i = 0; i <= 5; i++) {
setTimeout(function clog() { console.log(i); }, i * 1000);
}
})();
è equivalente a questo utilizzando solo var:
(function timer() {
for (var j = 0; j <= 5; j++) {
(function() {
var i = j;
setTimeout(function clog() { console.log(i); }, i * 1000);
}());
}
})();
utilizzando l'espressione di funzione immediatamente invocata per utilizzare l'ambito di funzione in un modo simile a come l'ambito di blocco funziona nell'esempio con let
.
Potrebbe essere scritto più breve senza utilizzare il nome j
, ma forse non sarebbe più chiaro:
(function timer() {
for (var i = 0; i <= 5; i++) {
(function (i) {
setTimeout(function clog() { console.log(i); }, i * 1000);
}(i));
}
})();
E anche più breve con funzioni di direzione:
(() => {
for (var i = 0; i <= 5; i++) {
(i => setTimeout(() => console.log(i), i * 1000))(i);
}
})();
(ma se si può usa le funzioni freccia, non c'è motivo di usare var
.)
Ecco come Babel.js traduce il tuo esempio con.210 per l'esecuzione in ambienti in cui non è disponibile let
:
"use strict";
(function timer() {
var _loop = function (i) {
setTimeout(function clog() {
console.log(i);
}, i * 1000);
};
for (var i = 0; i <= 5; i++) {
_loop(i);
}
})();
Grazie a Michael Geary per la pubblicazione il link al Babel.js nei commenti. Vedere il link nel commento per una demo dal vivo in cui è possibile modificare qualsiasi cosa nel codice e guardare la traduzione che si svolge immediatamente. È interessante vedere come vengono tradotte anche le altre funzionalità di ES6.
Vedere qui - http://stackoverflow.com/questions/762011/javascript-let-keyword-vs-var-keyword – eithed
Vale la pena notare che ci sono differenze tra la vecchia implementazione di Mozilla di "let' e la nuova ES2015 versione. Tuttavia, per le specifiche di questa domanda, il dupe risponde perfettamente. –
Non è un duplicato secondo me. Ogni volta che qualcuno chiede as o var, non possiamo indicarle una risposta molto generale. Si tratta in particolare di setTimeout(), che crea una "chiusura all'interno di un loop" - uno scenario problematico di sollevamento delle variabili comuni - la risposta e l'esempio di seguito non sono dettagliati nella risposta accettata duplicata collegata – Ryan