web-dev-qa-db-fra.com

Y a-t-il une raison d'utiliser le mot-clé "var" dans ES6?

Babel's guide de ES6 dit:

let est le nouveau var.

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?

274
callum

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.

219
Jerry101

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.

13
Aluan Haddad

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.

5
curiousdork

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).

2
yar1