Wenn man für den IE11 schreiben muss, geht es so (siehe Beispiel 4):
Beispiel 1 läuft nicht wie erwartet:
for (var x=0; x<3; x++) {
setTimeout(function(){
console.log(x); // 3,3,3
}, 100);
}
console.log(x); // 3 // unsauber
Beispiel 2: Saubere ES6 syntax, let
bewirkt das erwartete Resultat und besudelt nicht den äußeren Kontext, funktioniert aber nicht im IE11:
for (let x=0; x<3; x++) {
setTimeout(function(){
console.log(x); // 1,2,3
}, 100);
}
console.log(x); // ReferenceError: x is not defined // sauber
Beispiel 3: funktioniert auch vor ES6, die anonyme Funktion bewirkt das erwartete Resultat, aber der äußere Kontext wird besudelt.
for (var x=0; x<3; x++) {
(function(x){
setTimeout(function(){
console.log(x); // 1,2,3
}, 100);
})(x);
}
console.log(x); // 3 // unsauber
Beispiel 4: Das Wrappen in eine weitere anonyme Funktion funktioniert vor ES6 und im IE11 und der äußere Kontext bleibt sauber, aber – functionfunctionfunction:
(function(){
for (var x=0; x<3; x++) {
(function(x){
setTimeout(function(){
console.log(x); // 1,2,3
}, 100);
})(x);
}
})();
console.log(x); // ReferenceError: x is not defined // sauber
Fazit: der einzige Grund var
statt let
/const
zu verwenden ist wenn man für Pre-ES6 Browser schreiben muß.
Quellen:
Learning Advanced JavaScript, Beispiel 56
Is there any reason to use the “var” keyword in ES6?
Gruß, Nils