ECMAScript 6 présente la let
déclaration .
Je l'ai entendu dire qu'elle est décrite comme une variable "locale", mais je ne sais toujours pas comment elle se comporte différemment du var
mot clé.
Quelles sont les différences? Quand faut- let
il l'utiliser var
?
let
est inclus dans le projet de 6e édition et sera très probablement dans la spécification finale.Réponses:
Règles de cadrage
La principale différence réside dans les règles de portée. Les variables déclarées par
var
mot-clé sont étendues au corps de fonction immédiat (d'où la portée de la fonction) tandis que leslet
variables sont étendues au bloc englobant immédiat désigné par{ }
(d'où la portée du bloc).La raison pour laquelle le
let
mot clé a été introduit dans le langage était la portée de la fonction est déroutante et était l'une des principales sources de bogues dans JavaScript.Jetez un œil à cet exemple d' une autre question de stackoverflow :
My value: 3
a été sortie sur la console à chaque foisfuncs[j]();
que des fonctions anonymes étaient liées à la même variable.Les gens devaient créer des fonctions immédiatement invoquées pour capturer la valeur correcte des boucles mais c'était aussi poilu.
Levage
Alors que les variables déclarées avec le
var
mot clé sont hissées (initialisées avecundefined
avant l'exécution du code), ce qui signifie qu'elles sont accessibles dans leur portée englobante avant même qu'elles ne soient déclarées:let
les variables ne sont initialisées qu'après évaluation de leur définition. Leur accès avant l'initialisation se traduit par aReferenceError
. Variable dite "en zone morte temporelle" depuis le début du bloc jusqu'à ce que l'initialisation soit traitée.Création d'une propriété d'objet globale
Au niveau supérieur
let
, contrairement àvar
, ne crée pas de propriété sur l'objet global:Redéclaration
En mode strict,
var
vous permettra de re-déclarer la même variable dans la même portée tout enlet
lançant une SyntaxError.la source
let
l'expression de bloclet (variable declaration) statement
n'est pas standard et sera supprimée à l'avenir, bugzilla.mozilla.org/show_bug.cgi?id=1023609 .let
peut également être utilisé pour éviter les problèmes de fermeture. Il lie une nouvelle valeur plutôt que de conserver une ancienne référence comme indiqué dans les exemples ci-dessous.Le code ci-dessus illustre un problème de fermeture JavaScript classique. La référence à la
i
variable est stockée dans la fermeture du gestionnaire de clics, plutôt que la valeur réelle dei
.Chaque gestionnaire de clic unique fera référence au même objet car il n'y a qu'un seul objet compteur qui en contient 6, vous en obtenez donc six à chaque clic.
Une solution de contournement générale consiste à envelopper cela dans une fonction anonyme et à passer
i
comme argument. De tels problèmes peuvent également être évités maintenant en utilisant à lalet
placevar
comme indiqué dans le code ci-dessous.(Testé dans Chrome et Firefox 50)
la source
let
, mais il alerte "6" pour tous les boutons. Avez-vous une source indiquant commentlet
devrait se comporter?let
serait vraiment utile. La définition d'écouteurs d'événements dans une boucle ne nécessite plus d'expression de fonction immédiatement invoquée pour la portée localei
à chaque itération.Quelle est la différence entre
let
etvar
?var
instruction est connue dans toute la fonction dans laquelle elle est définie, depuis le début de la fonction. (*)let
instruction n'est connue que dans le bloc dans lequel elle est définie, à partir du moment où elle est définie. (**)Pour comprendre la différence, considérez le code suivant:
Ici, nous pouvons voir que notre variable
j
n'est connue que dans la première boucle for, mais pas avant ni après. Pourtant, notre variablei
est connue dans toute la fonction.Tenez également compte du fait que les variables de portée de bloc ne sont pas connues avant d'être déclarées car elles ne sont pas hissées. Vous n'êtes pas non plus autorisé à redéclarer la même variable de portée de bloc dans le même bloc. Cela rend les variables de portée de bloc moins sujettes aux erreurs que les variables de portée globale ou fonctionnelle, qui sont hissées et qui ne produisent aucune erreur en cas de déclarations multiples.
Est-il sûr d'utiliser
let
aujourd'hui?Certaines personnes diront qu'à l'avenir, nous n'utiliserons que les instructions let et que les instructions var deviendront obsolètes. Le gourou de JavaScript Kyle Simpson a écrit un article très élaboré sur les raisons pour lesquelles il pense que ce ne sera pas le cas .
Aujourd'hui, cependant, ce n'est certainement pas le cas. En fait, nous devons réellement nous demander s'il est sûr d'utiliser la
let
déclaration. La réponse à cette question dépend de votre environnement:Si vous écrivez du code JavaScript côté serveur ( Node.js ), vous pouvez utiliser l'
let
instruction en toute sécurité .Si vous écrivez du code JavaScript côté client et utilisez un transpilateur basé sur un navigateur (comme Traceur ou babel-standalone ), vous pouvez utiliser en toute sécurité l'
let
instruction, cependant votre code est susceptible d'être tout sauf optimal en termes de performances.Si vous écrivez du code JavaScript côté client et utilisez un transpilateur basé sur Node (comme le script shell traceur ou Babel ), vous pouvez utiliser l'
let
instruction en toute sécurité . Et comme votre navigateur ne connaîtra que le code transpilé, les inconvénients de performances devraient être limités.Si vous écrivez du code JavaScript côté client et n'utilisez pas de transpilateur, vous devez considérer la prise en charge du navigateur.
Il existe encore des navigateurs qui ne prennent pas
let
du tout en charge:Comment suivre la prise en charge du navigateur
Pour une vue d'ensemble à jour des navigateurs qui prennent en charge la
let
déclaration au moment de la lecture de cette réponse, consultez cetteCan I Use
page .(*) Les variables de portée globale et fonctionnelle peuvent être initialisées et utilisées avant d'être déclarées car les variables JavaScript sont hissées . Cela signifie que les déclarations sont toujours bien en haut de la portée.
(**) Les variables de portée de bloc ne sont pas hissées
la source
i
EST connue partout dans le bloc fonctionnel! Il commence parundefined
(en raison du levage) jusqu'à ce que vous affectiez une valeur! ps:let
est également hissé (en haut de son bloc contenant), mais donnera unReferenceError
lorsqu'il est référencé dans le bloc avant la première affectation. (PS2: Je suis un gars pro-point-virgule, mais vous n'avez vraiment pas besoin d'un point-virgule après un bloc). Cela dit, merci d'avoir ajouté la vérification de la réalité concernant le support!let
etvar
!let
et j'aiconst
été recommandé de ne l'utiliser que lorsque vous avez réellement besoin de leurs fonctionnalités supplémentaires , car l'application / la vérification de ces fonctionnalités supplémentaires (comme la constante d'écriture seule) entraîne `` plus de travail '(et des noeuds de portée supplémentaires dans l'arborescence de portée) pour les moteurs (actuels) à appliquer / vérifier / vérifier / configurer.Voici une explication du
let
mot - clé avec quelques exemples.Ce tableau sur Wikipedia montre quels navigateurs prennent en charge Javascript 1.7.
Notez que seuls les navigateurs Mozilla et Chrome le prennent en charge. IE, Safari et potentiellement d'autres non.
la source
let
msdn.microsoft.com/en-us/library/ie/dn342892%28v=vs.85%29.aspxIl manque un point à la réponse acceptée:
la source
for
initialiseur de boucle, rétrécissant considérablement le champ d'application des limitations delet
. A voté.let
Portée du bloc
Les variables déclarées à l'aide du
let
mot clé ont une portée de bloc, ce qui signifie qu'elles ne sont disponibles que dans le bloc dans lequel elles ont été déclarées.Au niveau supérieur (en dehors d'une fonction)
Au niveau supérieur, les variables déclarées à l'aide de
let
ne créent pas de propriétés sur l'objet global.À l'intérieur d'une fonction
A l'intérieur d'une fonction (mais à l'extérieur d'un bloc),
let
a la même portée quevar
.À l'intérieur d'un bloc
Les variables déclarées à l'aide d'
let
un bloc ne sont pas accessibles en dehors de ce bloc.À l'intérieur d'une boucle
Les variables déclarées avec des
let
boucles in ne peuvent être référencées qu'à l'intérieur de cette boucle.Boucles avec fermetures
Si vous utilisez
let
au lieu devar
dans une boucle, à chaque itération vous obtenez une nouvelle variable. Cela signifie que vous pouvez utiliser en toute sécurité une fermeture à l'intérieur d'une boucle.Zone morte temporelle
En raison de la zone morte temporelle , les variables déclarées à l'aide
let
ne sont pas accessibles avant d'être déclarées. Tenter de le faire génère une erreur.Pas de nouvelle déclaration
Vous ne pouvez pas déclarer la même variable plusieurs fois à l'aide de
let
. Vous ne pouvez pas non plus déclarer une variable à l'aidelet
du même identifiant qu'une autre variable déclarée à l'aidevar
.const
const
est assez similaire àlet
—il a une portée de bloc et a TDZ. Il y a cependant deux choses différentes.Pas de réaffectation
La variable déclarée à l'aide
const
ne peut pas être réaffectée.Notez que cela ne signifie pas que la valeur est immuable. Ses propriétés peuvent encore être modifiées.
Si vous voulez avoir un objet immuable, vous devez utiliser
Object.freeze()
.Un initialiseur est requis
Vous devez toujours spécifier une valeur lors de la déclaration d'une variable à l'aide de
const
.la source
Voici un exemple de la différence entre les deux (le support vient de démarrer pour Chrome):
Comme vous pouvez le voir, la
var j
variable a toujours une valeur en dehors de l'étendue de la boucle for (étendue de bloc), mais lalet i
variable n'est pas définie en dehors de l'étendue de la boucle for.la source
Il existe quelques différences subtiles - la
let
portée se comporte plus comme la portée variable dans plus ou moins toutes les autres langues.Par exemple, il s'étend au bloc englobant, ils n'existent pas avant d'être déclarés, etc.
Cependant, il convient de noter que ce
let
n'est qu'une partie des implémentations Javascript plus récentes et prend en charge divers degrés de navigateur .la source
let
est inclus dans le projet de 6e édition et sera très probablement dans la spécification finale.let
. Safari, IE et Chome ne le font pas tous.let
ne pas hisser, pour utiliser une variable définie par unelet
définie en haut de votre bloc. Si vous avez uneif
instruction qui est plus que quelques lignes de code, vous pouvez oublier que vous ne pouvez pas utiliser cette variable tant qu'elle n'est pas définie. GRAND POINT !!!let
va hisser la variable en haut du bloc. Cependant, référencer la variable dans le bloc avant la déclaration de variable entraîne une ReferenceError (ma note: au lieu de bonne vieilleundefined
). La La variable se trouve dans une "zone morte temporelle" depuis le début du bloc jusqu'à ce que la déclaration soit traitée. " Il en va de même pour les "instructions switch car il n'y a qu'un seul bloc sous-jacent". Source: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…La principale différence est la différence de portée , alors que let ne peut être disponible qu'à l'intérieur de la portée déclarée, comme dans la boucle for, var est accessible en dehors de la boucle par exemple. De la documentation dans MDN (exemples également de MDN):
N'oubliez pas non plus qu'il s'agit de la fonctionnalité ECMA6, il n'est donc pas encore entièrement pris en charge, il est donc préférable de toujours le transpiler vers ECMA5 en utilisant Babel, etc. ... pour plus d'informations sur le site Web de Babel
la source
Variable sans levagelet
ne sera pas hissé sur toute l'étendue du bloc dans lequel ils apparaissent. En revanche,var
pourrait être hissé comme ci-dessous.En fait, Per @Bergi, les deux
var
etlet
sont hissés .Collecte des ordures
L'étendue des blocs de
let
est utile concerne les fermetures et la récupération de place pour récupérer la mémoire. Considérer,Le
click
rappel du gestionnaire n'a pas du tout besoin de lahugeData
variable. Théoriquement, après lesprocess(..)
exécutions, l'énorme structure de donnéeshugeData
pourrait être récupérée. Cependant, il est possible que certains moteurs JS devront toujours conserver cette structure énorme, car laclick
fonction a une fermeture sur toute l'étendue.Cependant, la portée du bloc peut rendre cette énorme structure de données à la poubelle collectée.
let
boucleslet
dans la boucle peut le lier à nouveau à chaque itération de la boucle, en veillant à lui réaffecter la valeur de la fin de l'itération de boucle précédente. Considérer,Cependant, remplacez
var
parlet
Parce que
let
créer un nouvel environnement lexical avec ces noms pour a) l'expression d'initialisation b) chaque itération (surtout pour évaluer l'expression d'incrémentation), plus de détails sont ici .la source
Voici un exemple à ajouter à ce que d'autres ont déjà écrit. Supposons que vous vouliez créer un tableau de fonctions,,
adderFunctions
où chaque fonction prend un seul argument Number et renvoie la somme de l'argument et de l'index de la fonction dans le tableau. Essayer de généreradderFunctions
avec une boucle en utilisant levar
mot - clé ne fonctionnera pas comme quelqu'un pourrait l'attendre naïvement:Le processus ci-dessus ne génère pas le tableau de fonctions souhaité car
i
la portée de s'étend au-delà de l'itération dufor
bloc dans lequel chaque fonction a été créée. Au lieu de cela, à la fin de la boucle, lai
fermeture de chaque fonction fait référence ài
la valeur de 'à la fin de la boucle (1000) pour chaque fonction anonyme dansadderFunctions
. Ce n'est pas du tout ce que nous voulions: nous avons maintenant un tableau de 1000 fonctions différentes en mémoire avec exactement le même comportement. Et si nous mettons à jour la valeur dei
, la mutation affectera tous lesadderFunctions
.Cependant, nous pouvons réessayer en utilisant le
let
mot - clé:Cette fois,
i
on rebondit à chaque itération de lafor
boucle. Chaque fonction conserve désormais la valeur dei
au moment de sa création etadderFunctions
se comporte comme prévu.Maintenant, mélangez l'image des deux comportements et vous verrez probablement pourquoi il n'est pas recommandé de mélanger le plus récent
let
etconst
le plus ancienvar
dans le même script. Cela peut entraîner un code déroutant spectaculaire.Ne laissez pas cela vous arriver. Utilisez un linter.
la source
let value = i;
. L'for
instruction crée un bloc lexical.La différence réside dans la portée des variables déclarées avec chacune.
Dans la pratique, la différence de portée a plusieurs conséquences utiles:
let
les variables ne sont visibles que dans leur bloc englobant le plus proche ({ ... }
).let
les variables ne sont utilisables que dans les lignes de code qui se produisent après la déclaration de la variable (même si elles sont hissées !).let
les variables ne peuvent pas être redéclarées par unvar
oulet
.let
variables globales ne sont pas ajoutées à l'window
objet global .let
les variables sont faciles à utiliser avec les fermetures (elles ne provoquent pas de conditions de concurrence ).Les restrictions imposées par
let
réduisent la visibilité des variables et augmentent la probabilité que des collisions de noms inattendues soient détectées tôt. Cela facilite le suivi et le raisonnement des variables, y compris leur accessibilité (aidant à récupérer la mémoire inutilisée).Par conséquent, les
let
variables sont moins susceptibles de causer des problèmes lorsqu'elles sont utilisées dans de grands programmes ou lorsque des cadres développés indépendamment sont combinés de manière nouvelle et inattendue.var
peut toujours être utile si vous êtes sûr de vouloir l'effet de liaison unique lorsque vous utilisez une fermeture dans une boucle (# 5) ou pour déclarer des variables globales visibles de l'extérieur dans votre code (# 4). L'utilisation devar
for exports peut être supplantée si laexport
migration hors de l'espace du transpilateur et vers le langage principal.Exemples
1. Aucune utilisation en dehors du bloc englobant le plus proche: ce bloc de code générera une erreur de référence car la deuxième utilisation de
x
se produit en dehors du bloc où il est déclaré aveclet
:En revanche, le même exemple avec des
var
œuvres.2. Pas d'utilisation avant la déclaration:
ce bloc de code lancera un
ReferenceError
avant que le code puisse être exécuté car ilx
est utilisé avant sa déclaration:En revanche, le même exemple avec
var
analyse et s'exécute sans lever d'exceptions.3. Pas de redéclaration: Le code suivant montre qu'une variable déclarée avec
let
ne peut pas être redéclarée ultérieurement:4. Mondiaux non attachés à
window
:5. Utilisation facile avec les fermetures: les variables déclarées avec
var
ne fonctionnent pas bien avec les fermetures à l'intérieur des boucles. Voici une boucle simple qui produit la séquence de valeurs que la variablei
a à différents moments:Plus précisément, cela génère:
En JavaScript, nous utilisons souvent des variables beaucoup plus tard que lors de leur création. Lorsque nous démontrons cela en retardant la sortie avec une fermeture passée à
setTimeout
:... la sortie reste inchangée tant que nous respectons
let
. En revanche, si nous avions utilisé à lavar i
place:... la boucle produit cinq fois "i is 5" de façon inattendue:
la source
var
au lieu delet
, le code est équivalent à:var i = 0; while (i < 5) { doSomethingLater(); i++; }
i
est en dehors de la fermeture, et au moment où ildoSomethingLater()
est exécuté,i
a déjà été incrémenté 5 fois, donc la sortie esti is 5
cinq fois. En utilisantlet
, la variable sei
trouve dans la fermeture, donc chaque appel asynchrone obtient sa propre copie dei
au lieu d'utiliser celle «globale» qui a été créée avecvar
.for
. Une transformation plus précise, bien que plus compliquée, est la classiquefor (var i = 0; i < 5; i++) { (function(j) { setTimeout(_ => console.log(
i est $ {j}), 125/*ms*/); })(i); }
qui introduit un "enregistrement d'activation de fonction" pour enregistrer chaque valeur dei
avec le nom de l'j
intérieur de la fonction.Que les deux fonctions suivantes montrent la différence:
la source
let
est intéressant, car il nous permet de faire quelque chose comme ça:Ce qui se traduit par un comptage [0, 7].
Tandis que
Ne compte que [0, 1].
la source
Portée du bloc VS:
La principale différence entre
var
etlet
est que les variables déclarées avecvar
ont une portée de fonction . Alors que les fonctions déclarées aveclet
sont de portée bloc . Par exemple:variables avec
var
:Lorsque la première fonction
testVar
est appelée, la variable foo, déclarée avecvar
, est toujours accessible en dehors de l'if
instruction. Cette variablefoo
serait disponible partout dans le cadre de latestVar
fonction .variables avec
let
:Lorsque la deuxième fonction
testLet
est appelée, la barre de variables, déclarée aveclet
, n'est accessible qu'à l'intérieur de l'if
instruction. Étant donné que les variables déclarées aveclet
sont bloc scope (où un bloc est le code entre accolades , par exempleif{}
,for{}
,function{}
).let
les variables ne sont pas hissées:Une autre différence entre
var
etlet
est que les variables avec déclaré aveclet
ne sont pas hissées . Un exemple est la meilleure façon d'illustrer ce comportement:les variables avec
let
ne sont pas hissées:les variables avec
var
ne sont hissées:Global
let
ne s'attache pas àwindow
:Une variable déclarée avec
let
dans la portée globale (qui est du code qui n'est pas dans une fonction) n'est pas ajoutée en tant que propriété sur l'window
objet global . Par exemple (ce code a une portée globale):Utilisez-
let
levar
chaque fois que vous le pouvez, car il est simplement plus précis. Cela réduit les conflits de nommage potentiels qui peuvent survenir lors du traitement d'un grand nombre de variables.var
peut être utilisé lorsque vous voulez qu'une variable globale soit explicitement sur l'window
objet (pensez toujours soigneusement si c'est vraiment nécessaire).la source
Il semble également que, au moins dans Visual Studio 2015, TypeScript 1.5, «var» autorise plusieurs déclarations du même nom de variable dans un bloc, et «let» ne le permet pas.
Cela ne générera pas d'erreur de compilation:
Cette volonté:
la source
var
est une variable de portée globale (pouvant être hissée).let
etconst
est la portée du bloc.la source
Lors de l'utilisation
let
Le
let
mot-clé attache la déclaration de variable à la portée de n'importe quel bloc (généralement une{ .. }
paire) dans laquelle il est contenu. En d'autres termes,let
détourne implicitement la portée de tout bloc pour sa déclaration de variable.let
les variables ne sont pas accessibles dans l'window
objet car elles ne sont pas accessibles globalement.Lors de l'utilisation
var
var
et les variables dans ES5 ont des étendues dans les fonctions, ce qui signifie que les variables sont valides dans la fonction et non en dehors de la fonction elle-même.var
les variables sont accessibles dans l'window
objet car elles ne sont pas accessibles globalement.Si vous voulez en savoir plus, continuez à lire ci-dessous
l'une des questions d'entrevue les plus célèbres sur la portée peut également suffire à l'utilisation exacte de
let
etvar
comme ci-dessous;Lors de l'utilisation
let
En effet, lors de l'utilisation
let
, pour chaque itération de boucle, la variable est délimitée et possède sa propre copie.Lors de l'utilisation
var
En effet, lors de l'utilisation
var
, pour chaque itération de boucle, la variable est délimitée et a une copie partagée.la source
En termes les plus élémentaires,
⚡️ Bac à sable pour jouer ↓
la source
Si je lis bien les spécifications, alors
let
heureusement, on peut également tirer parti pour éviter les fonctions auto-appelantes utilisées pour simuler des membres privés uniquement - un modèle de conception populaire qui diminue la lisibilité du code, complique le débogage, qui n'ajoute aucune protection de code réelle ou autre avantage - sauf peut-être pour satisfaire quelqu'un désir de sémantique, alors arrêtez de l'utiliser. / diatribeVoir « Émulation d'interfaces privées »
la source
let
font? (Je suppose que vous voulez dire IIFE avec «fonction auto-invoquante».)hiddenProperty
dans le constructeur? Il n'y en a qu'unehiddenProperty
pour toutes les instances de votre «classe».Quelques hacks avec
let
:1.
2.
3.
Getter et setter avec
let
:la source
let { type, name, value } = node;
? vous créez un nouvel objet avec 3 propriétés type / nom / valeur et les initialisez avec les valeurs de propriétés du nœud?var
.let vs var. C'est une question de portée .
Les variables var sont globales et sont accessibles pratiquement partout, tandis que les variables let ne sont pas globales et n'existent que jusqu'à ce qu'une parenthèse fermante les tue.
Voir mon exemple ci-dessous, et notez comment la variable lion (let) agit différemment dans les deux console.logs; il devient hors de portée dans le 2ème console.log.
la source
la source
let fait partie d'es6. Ces fonctions expliqueront la différence de manière simple.
la source
Ce qui suit montre comment «let» et «var» sont différents dans la portée:
Le
gfoo
, défini parlet
initialement est dans la portée globale , et lorsque nous déclarons àgfoo
nouveau à l'intérieur deif clause
sa portée modifiée et lorsqu'une nouvelle valeur est affectée à la variable à l'intérieur de cette portée, cela n'affecte pas la portée globale.Alors que
hfoo
, défini parvar
est initialement dans la portée globale , mais encore une fois lorsque nous le déclarons à l'intérieur deif clause
, il considère la portée globale hfoo, bien que var ait été utilisé à nouveau pour le déclarer. Et lorsque nous réaffectons sa valeur, nous constatons que la portée globale hfoo est également affectée. C'est la principale différence.la source
Comme mentionné ci-dessus:
Exemple 1:
Dans mes deux exemples, j'ai une fonction
myfunc
.myfunc
contient une variablemyvar
égale à 10. Dans mon premier exemple, je vérifie si ellemyvar
est égale à 10 (myvar==10
). Si oui, je déclare une variablemyvar
(maintenant j'ai deux variables myvar) en utilisant unvar
mot-clé et lui attribue une nouvelle valeur (20). Dans la ligne suivante, j'imprime sa valeur sur ma console. Après le bloc conditionnel, j'imprime à nouveau la valeur demyvar
sur ma console. Si vous regardez la sortie demyfunc
, lamyvar
valeur est égale à 20.Exemple2: Dans mon deuxième exemple, au lieu d'utiliser un
var
mot clé dans mon bloc conditionnel, je déclaremyvar
utiliser unlet
mot clé. Maintenant, quand j'appelle,myfunc
j'obtiens deux sorties différentes:myvar=20
etmyvar=10
.La différence est donc très simple, c'est-à-dire sa portée.
la source
Je veux lier ces mots clés au contexte d'exécution, car le contexte d'exécution est important dans tout cela. Le contexte d'exécution comporte deux phases: une phase de création et une phase d'exécution. De plus, chaque contexte d'exécution a un environnement variable et un environnement extérieur (son environnement lexical).
Pendant la phase de création d'un contexte d'exécution, var, let et const conserveront toujours sa variable en mémoire avec une valeur non définie dans l'environnement variable du contexte d'exécution donné. La différence réside dans la phase d'exécution. Si vous utilisez référence une variable définie avec var avant de lui attribuer une valeur, elle ne sera simplement pas définie. Aucune exception ne sera levée.
Cependant, vous ne pouvez pas référencer la variable déclarée avec let ou const tant qu'elle n'est pas déclarée. Si vous essayez de l'utiliser avant qu'il ne soit déclaré, une exception sera déclenchée pendant la phase d'exécution du contexte d'exécution. Maintenant, la variable sera toujours en mémoire, gracieuseté de la phase de création du contexte d'exécution, mais le moteur ne vous permettra pas de l'utiliser:
Avec une variable définie avec var, si le moteur ne peut pas trouver la variable dans l'environnement variable du contexte d'exécution actuel, il remontera la chaîne de portée (l'environnement externe) et vérifiera l'environnement variable de l'environnement externe pour la variable. S'il ne le trouve pas, il continuera de rechercher la chaîne de portée. Ce n'est pas le cas avec let et const.
La deuxième caractéristique de let est qu'elle introduit la portée du bloc. Les blocs sont définis par des accolades. Les exemples incluent les blocs fonction, si les blocs, pour les blocs, etc. Lorsque vous déclarez une variable avec let à l'intérieur d'un bloc, la variable n'est disponible qu'à l'intérieur du bloc. En fait, chaque fois que le bloc est exécuté, comme dans une boucle for, il crée une nouvelle variable en mémoire.
ES6 introduit également le mot clé const pour déclarer des variables. const a également une portée de bloc. La différence entre let et const est que les variables const doivent être déclarées à l'aide d'un initialiseur, sinon elles généreront une erreur.
Et, enfin, en ce qui concerne le contexte d'exécution, les variables définies avec var seront attachées à l'objet 'this'. Dans le contexte d'exécution global, ce sera l'objet fenêtre dans les navigateurs. Ce n'est pas le cas pour let ou const.
la source
Je pense que les termes et la plupart des exemples sont un peu écrasants. Le principal problème que j'ai eu personnellement avec la différence est de comprendre ce qu'est un "bloc". À un moment donné, je me suis rendu compte qu'un bloc serait constitué de crochets, sauf pour l'
IF
instruction. une parenthèse ouvrante{
d'une fonction ou d'une boucle définira un nouveau bloc, tout ce qui y est définilet
, ne sera pas disponible après la parenthèse fermante}
de la même chose (fonction ou boucle); Dans cet esprit, il était plus facile de comprendre:la source
Maintenant, je pense qu'il y a une meilleure portée des variables à un bloc d'instructions en utilisant
let
:Je pense que les gens commenceront à utiliser let ici après afin d'avoir une portée similaire en JavaScript comme d'autres langages, Java, C #, etc.
Les personnes n'ayant pas une compréhension claire de la portée de JavaScript avaient l'habitude de commettre l'erreur plus tôt.
Le levage n'est pas pris en charge à l'aide
let
.Avec cette approche, les erreurs présentes dans JavaScript sont supprimées.
Reportez-vous à ES6 In Depth: let et const pour mieux le comprendre.
la source
Cet article définit clairement la différence entre var, let et const
https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.esmkpbg9b
la source