Le guide de Babel sur ES6 dit:
let
est le nouveauvar
.
Apparemment, la seule différence est que la var
portée est affectée à la fonction actuelle , tandis que let
le bloc actuel l’ est . Il y a quelques bons exemples dans cette réponse .
Je ne vois aucune raison d'utiliser le var
code ES6. Même si vous souhaitez étendre une variable donnée à l'ensemble de la fonction, vous pouvez le faire let
en plaçant la déclaration en haut du bloc de fonction, ce que vous devriez faire de var
toute façon pour indiquer l'étendue réelle. Et si vous voulez inclure plus finement quelque chose dans un for
bloc ou quelque chose, vous pouvez le faire aussi.
Donc, mon instinct est de cesser var
complètement d’ utiliser lors de l’écriture de code ES6.
Ma question est la suivante: est-ce que je me trompe? Y at-il un cas légitime où var
serait préférable sur let
?
la source
var
un indicateur conscient du fait que cette variable est destinée à être étendue à l'ensemble de la fonction pourrait être une convention utile de "documentation automatique" .let
déclaration au sommet d'une fonction, je pense qu'il est tout aussi évident que vous vouliez l'étendre à l'ensemble de la fonction. Je ne pense pas que l’utilisationvar
rend le tout plus clair que simplement le localiser au sommet.var
qui existe toujours est la compatibilité ascendante. Si ce n’était pas le cas, ils se seraientvar
complètement retirés , ou n’auraient jamais été introduitslet
au départ, changeant plutôt la sémantique devar
ce qu’elle aurait dû être depuis le début .var
me semblent minces et insuffisantes pour justifier un troisième type de variable qui saute aux yeux. Vous pouvez définir unelet
fonction entière en la plaçant tout simplement en haut de la fonction, ce qui est beaucoup plus clair que l’écriturevar
dans un bloc (afin de l’extraire de ce bloc afin que vous puissiez ensuite l’utiliser en dehors du bloc). - bizarre). Il prévient que si vous définissez unelet
fonction comme une fonction, "c'est simplement la position qui indique la différence, plutôt que la syntaxe", mais je pense que c'est une bonne chose.var
. les exemples qu’il donne à gardervar
semblent artificiels - et sont basés sur de graves erreurs de codage. Il est bien mieux de se heurter à une erreur et d’être forcé de la corriger que d’utiliser des fonctions de langage qui laissent l’échapper! Ensuite, nous vous conseillons de tout inclure dans un essai / accrochage pour éviter les collisions? Le reste de ce lien est bon mais je ne suis pas du tout d'accord avec cela.Réponses:
Doug Crockford discute
let
à ce stade de son discours, " The Better Parts ".Le fait est,
let
évite une source de malentendu, esp. pour les programmeurs avec des attentes définies par les langues avec block-scope. Une portée de fonctionvar
a (elle déclare une variable visible dans toute la fonction) même si elle semble avoir une portée de bloc .var
pourrait peut-être encore être utile dans des cas extrêmes comme le code généré par une machine, mais j'étire fort là-bas(
const
est également nouveau et a une portée de bloc. Après quelet x = {'hi': 'SE'}
vous puissiez réaffecter àx
, alors queconst y = x
vous ne pouvez pas le fairey
. C’est souvent préférable car cela empêche tout changement accidentel de votre vue. Mais pour être clair, vous pouvez toujours modifier l’objety.hi = 'SO'
à le congeler.)De manière réaliste, votre impression est juste pour ES6: Adopter
let
etconst
. Arrêtez d'utiliservar
.(Dans une autre performance de « The Better pièces » , Doug dit pourquoi
===
a été ajouté plutôt que de fixer les problèmes de==
.==
Produit des résultats surprenants « », donc juste d' adopter===
.)Un exemple révélateur
Mozilla Developer Network donne un exemple où
var
ne fonctionne pas comme prévu. Leur exemple est réaliste: il définit lesonclick
gestionnaires dans une page Web. Voici un cas de test plus petit:var
nous échoue car toutes les itérations de la boucle partagent la mêmei
variable à étendue de fonction, qui a la valeur une5
fois la boucle terminée.la source
==
n'est pas cassé du tout. Il peut simplement être défini comme suit:equality comparison using coersion
Check out github.com/getify/You-Dont-Know-JS/blob/master/…[ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
let
etvar
mais plutôt entrelet
,var
etconst
var
fonctionne comme prévu, mais pas combien de personnes attendent. C'est un bug de convivialité, pas un bug d'implémentation.Si vous avez écrit du code correct, vous pourrez probablement transformer toutes les
var
instructions enlet
instructions sans aucun changement sémantique.let
est préférable car elle réduit la portée dans laquelle un identifiant est visible. Cela 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 modifier une référence, utilisez uneconst
déclaration. Cela présente tous les avantages delet
réduire la présence de variables unitarisées et de rendre le code généralement plus facile à raisonner. Si vous n'êtes pas sûr de devoir muter une référence, déclarez-laconst
jusqu'à ce que vous en ayez explicitement besoin.la source
Je ne pense pas nécessairement que vous ayez tort, mais l'utilisation de var est soumise à des restrictions. Essentiellement, ils
let
devraient aider les développeurs à surmonter la stupidité de JavaScript, en particulier en ce qui concerne les conflits de noms.var
, semble-t-il, a une portée plus large puisqu'il veut aller à la fonction de fermeture. Il y aura des moments où vous aurez besoin de var, comme lorsque vous avez besoin d'une variable temporaire pour être disponible dans le cadre d'un bloc à l'intérieur d'une fonction, sinon, préférerlet
var aidera les développeurs aux conflits de noms. Sur une note plus légère, il est temps que l'ES6 soit introduitlet
.la source
var
dans un bloc est disponible dans toute la fonction, mais pas dans un bloc. C'est une caractéristique trompeuse.J'ai tendance à être d'accord que seul "laisser" devrait être utilisé dans es6. AFIK, redéclarer un "let" génère une erreur (ce qui est bien), alors qu'avec "var", vous écrasez simplement la valeur (bien que le "mode strict" dans es5 s'en occupe également).
la source
let
signifie "laisser variable égale". C'est une déclaration, en d'autres termes, une initialisation et une affectation.Il existe par opposition à
const
ce qui bien sûr signifie "constant" - ce qui est l'opposé de variable.D'autres langues utilisent un préfixe pour l'objet réel au lieu de l'objet lors de sa déclaration (par exemple,
def
un raccourci pour "define function" - ce qui manque complètement le point de ce qui est "def".Let
ajoute cette incohérence sémantique à Javascript.Logiquement, vous pouvez également laisser une constante égale à quelque chose, puisque le mot-clé "let" a pour tâche d'attribuer de la mémoire.
Le problème se pose parce que le
var
mot - clé a été introduit avant, ilconst
était donc compatible avec les versions antérieures.var
ne veut pas nécessairement dire une variable. (Il pourrait également être utilisé pour attribuer une valeur constante.)Par conséquent, l'introduction de
let
la mauvaise position. Pour s'assurer de ne pas oublier que lexicalement, c'est faux, ils ont également décidé de changer la portée lexicale delet
vsvar
, de sorte que l'incohérence est notre principale préoccupation lors du débogage.En d'autres termes,
let
existe parce que les utilisateurs (c'est-à-dire les responsables de la langue) ont pensé que Javascript était trop cohérent, après avoir maîtrisé tous ses idiomes et ses idiosyncrasies, il désirait davantage.Note latérale,
var
ne fonctionne pas dans les blocs "flèche" si vous voulez traiter lesdits blocs comme des fermetures (car avar
été introduit avant de traiter les blocs comme des fermetures), maislet
si.la source
let
car elle est en contradiction avec le ton d’autres mots clés de la même catégorie en JavaScript. Cela ne répond toujours pas à la question et n’est pas particulièrement bien exprimé. Downvotedlet
Ce ne sont pas seulement les développeurs qui désirent plus de complexité. C'est en fait intuitivement plus compréhensible, car lorsque vous bouclez et fermez sur vars, la fermeture conserve la dernière valeur de la variable, mais lorsque vous effectuez la même opération, chaque fermeture de la boucle a sa propre valeur, l'exemple de @ Jerry101 ci