Babel's guide de ES6 dit:
let
est le nouveauvar
.
Apparemment, la seule différence est que var
est étendue à la fonction courante , tandis que let
est étendue au courant bloc . Il y a de bons exemples dans cette réponse .
Je ne vois aucune raison d'utiliser var
dans le code ES6. Même si vous voulez étendre une variable donnée à la fonction entière, vous pouvez le faire avec let
en plaçant la déclaration en haut du bloc fonction, ce que vous devriez faire avec var
de toute façon pour indiquer la portée réelle. Et si vous souhaitez définir quelque chose de plus fin dans un bloc for
ou quelque chose, vous pouvez le faire aussi.
Donc mon instinct est d'arrêter complètement d'utiliser var
lors de l'écriture de code ES6.
Ma question est, je me trompe à ce sujet? Existe-t-il un cas légitime où var
serait préférable à let
?
Doug Crockford discute de let
à ce point dans son discours, " The Better Parts ".
Le fait est que let
évite une source de malentendu, en particulier. pour les programmeurs dont les attentes sont définies par des langages à portée de bloc. Un var
a portée de la fonction (il déclare une variable visible dans toute la fonction) même s'il regarde comme il a portée du bloc.
var
pourrait peut-être encore être utile dans un cas extrême comme le code généré par la machine, mais je m'étire fort là-bas.
(const
est également nouveau et a une portée de bloc. Après let x = {'hi': 'SE'}
vous pouvez réaffecter à x
, tandis qu'après const y = x
vous ne pouvez pas réaffecter à y
. C'est souvent préférable car cela empêche quelque chose de changer accidentellement sous vous. Mais pour être clair, vous pouvez toujours modifier l'objet y.hi = 'SO'
sauf si vous le gelez.)
De manière réaliste, votre impression est bonne pour ES6: Adoptez let
et const
. Arrêtez d'utiliser var
.
(Dans ne autre représentation de "The Better Parts" , Doug explique pourquoi ===
a été ajouté au lieu de corriger les problèmes de ==
. ==
produit des résultats "surprenants", alors adoptez simplement ===
.)
Un exemple révélateur
Mozilla Developer Network donne un exemple où var
ne fonctionne pas comme prévu. Leur exemple est réaliste et définit les gestionnaires onclick
dans une page Web. Voici un cas de test plus petit:
var a = [];
(function () {
'use strict';
for (let i = 0; i < 5; ++i) { // *** `let` works as expected ***
a.Push( function() {return i;} );
}
} ());
console.log(a.map( function(f) {return f();} ));
// prints [0, 1, 2, 3, 4]
// Start over, but change `let` to `var`.
// prints [5, 5, 5, 5, 5]
var
nous déclenche car toutes les itérations de boucle partagent la même variable i
de portée fonction, qui a la valeur 5
une fois la boucle terminée.
Un autre exemple révélateur
function f(x) {
let y = 1;
if (x > 0) {
let y = 2; // `let` declares a variable in this block
}
return y;
}
[f(1), f(-1)] // --> [1, 1]
// Start over, but change `let` to `var`.
// --> [2, 1]
let
déclare des variables de portée bloc. var
nous confond en faisant référence à la même variable dans toute la fonction.
Si vous avez écrit du code correct, vous pourrez probablement transformer toutes les instructions var
en instructions let
sans aucun changement sémantique.
let
est préférable car il réduit la portée dans laquelle un identifiant est visible. Il nous permet de déclarer en toute sécurité des variables sur le site de première utilisation.
const
est préférable à let
. Sauf si vous devez muter une référence, utilisez une déclaration const
. Cela présente tous les avantages de let
tout en réduisant la présence de variables unitarisées et en rendant le code généralement plus facile à raisonner. Si vous n'êtes pas sûr de devoir muter une référence, déclarez-la const
jusqu'à ce que vous en ayez explicitement besoin.
Je ne pense pas nécessairement que vous vous trompiez mais il y a des mises en garde à utiliser var. Essentiellement, let
devrait aider les développeurs à contourner la stupidité de JavaScript, en particulier avec les conflits de noms. var
, semble-t-il, a une portée plus grande car il veut aller à la portée de la fonction ferme. Il y aura des moments où vous aurez besoin de var, comme quand vous avez besoin d'une variable temporaire pour être disponible dans la portée d'un bloc à l'intérieur d'une fonction, sinon, préférer let
à var aidera les développeurs avec les conflits de nommage. Sur une note plus légère, il est grand temps que ES6 présente let
.
J'ai tendance à convenir que seul "let" devrait être utilisé dans es6. AFIK, redéclarer un "let" génère une erreur (ce qui est bien), tandis qu'avec "var", vous remplacez simplement la valeur (bien que le "mode strict" dans es5 s'en occupe également).