Introducción de ECMAScript 6 la letdeclaración .
He oído que se describe como una variable "local", pero todavía no estoy muy seguro de cómo se comporta de manera diferente al var palabra clave.
¿Cuáles son las diferencias? ¿Cuándo se debe letusar var?

letse incluye en el borrador de la sexta edición y probablemente estará en la especificación final.Respuestas:
Reglas de alcance
La principal diferencia son las reglas de alcance. Las variables declaradas por
varpalabra clave tienen un alcance en el cuerpo de la función inmediata (de ahí el alcance de la función) mientras que lasletvariables tienen un alcance en el bloque de cierre inmediato denotado por{ }(de ahí el alcance del bloque).La razón por la cual
letse introdujo la palabra clave en el lenguaje fue que el alcance de la función es confuso y fue una de las principales fuentes de errores en JavaScript.Eche un vistazo a este ejemplo de otra pregunta de stackoverflow :
My value: 3se emitía a la consola cada vez quefuncs[j]();se invocaba ya que las funciones anónimas estaban vinculadas a la misma variable.La gente tenía que crear funciones invocadas de inmediato para capturar el valor correcto de los bucles, pero eso también era complicado.
Elevación
Si bien las variables declaradas con la
varpalabra clave son izadas (inicializadasundefinedantes de que se ejecute el código), lo que significa que son accesibles en su ámbito de inclusión incluso antes de que se declaren:letLas variables no se inicializan hasta que se evalúa su definición. Acceder a ellos antes de que la inicialización resulte en aReferenceError. Se dice que la variable está en "zona muerta temporal" desde el inicio del bloque hasta que se procesa la inicialización.Crear propiedad de objeto global
En el nivel superior
let, a diferencia devar, no crea una propiedad en el objeto global:Redeclaración
En modo estricto,
varle permitirá volver a declarar la misma variable en el mismo ámbito mientrasletgenera un SyntaxError.fuente
letla expresión de bloquelet (variable declaration) statementno es estándar y se eliminará en el futuro, bugzilla.mozilla.org/show_bug.cgi?id=1023609 .letTambién se puede utilizar para evitar problemas con los cierres. Vincula un valor nuevo en lugar de mantener una referencia antigua como se muestra en los ejemplos a continuación.El código anterior muestra un problema clásico de cierre de JavaScript. La referencia a la
ivariable se almacena en el cierre del controlador de clics, en lugar del valor real dei.Cada controlador de un solo clic se referirá al mismo objeto porque solo hay un objeto de contador que contiene 6, por lo que obtienes seis en cada clic.
Una solución general es envolver esto en una función anónima y pasarlo
icomo argumento. Tales problemas también se pueden evitar ahora utilizando en suletlugarvarcomo se muestra en el código a continuación.(Probado en Chrome y Firefox 50)
fuente
let, pero alerta "6" para todos los botones. ¿Tienes alguna fuente que diga cómoletse supone que debe comportarse?letsería realmente útil. La configuración de escuchas de eventos en un bucle ya no requiere una expresión de función invocada inmediatamente para el alcance localien cada iteración.¿Cuál es la diferencia entre
letyvar?vardeclaración se conoce en toda la función en la que se define, desde el inicio de la función. (*)letdeclaración solo se conoce en el bloque en el que se define, desde el momento en que se define en adelante. (**)Para comprender la diferencia, considere el siguiente código:
Aquí, podemos ver que nuestra variable
jsolo se conoce en el primer bucle for, pero no antes y después. Sin embargo, nuestra variableies conocida en toda la función.Además, tenga en cuenta que las variables de ámbito de bloque no se conocen antes de declararse porque no se izan. Tampoco se le permite volver a declarar la misma variable de ámbito de bloque dentro del mismo bloque. Esto hace que las variables de ámbito de bloque sean menos propensas a errores que las variables de ámbito global o funcional, que se izan y que no producen ningún error en caso de declaraciones múltiples.
¿Es seguro usarlo
lethoy?Algunas personas argumentan que en el futuro SOLO usaremos declaraciones let y que las declaraciones var se volverán obsoletas. El gurú de JavaScript Kyle Simpson escribió un artículo muy elaborado sobre por qué cree que ese no será el caso .
Hoy, sin embargo, ese definitivamente no es el caso. De hecho, debemos preguntarnos si es seguro usar la
letdeclaración. La respuesta a esa pregunta depende de su entorno:Si está escribiendo código JavaScript del lado del servidor ( Node.js ), puede usar la
letdeclaración de forma segura .Si está escribiendo código JavaScript del lado del cliente y usa un transpilador basado en navegador (como Traceur o babel-standalone ), puede usar la
letdeclaración de forma segura , sin embargo, es probable que su código sea todo menos óptimo con respecto al rendimiento.Si está escribiendo código JavaScript del lado del cliente y usa un transpilador basado en Nodo (como el script de shell traceur o Babel ), puede usar la
letdeclaración de manera segura . Y debido a que su navegador solo sabrá sobre el código transpilado, los inconvenientes de rendimiento deben ser limitados.Si está escribiendo código JavaScript del lado del cliente y no usa un transpilador, debe considerar la compatibilidad con el navegador.
Todavía hay algunos navegadores que no admiten
letnada:Cómo realizar un seguimiento del soporte del navegador
Para obtener una descripción actualizada de qué navegadores admiten la
letdeclaración al momento de leer esta respuesta, consulte estaCan I Usepágina .(*) Las variables de ámbito global y funcional pueden inicializarse y utilizarse antes de declararse porque las variables de JavaScript se izan . Esto significa que las declaraciones siempre están en lo más alto del alcance.
(**) Las variables de ámbito de bloque no se izan
fuente
iES conocido en todas partes en el bloque de funciones! ¡Comienza comoundefined(debido al izado) hasta que asignes un valor! ps:lettambién se iza (en la parte superior del bloque que contiene), pero dará unReferenceErrorcuando se hace referencia en el bloque antes de la primera asignación. (ps2: soy un tipo pro-punto y coma, pero realmente no necesitas un punto y coma después de un bloqueo). Dicho esto, ¡gracias por agregar el control de realidad con respecto al soporte!letyvar!letyconstse me recomendó usar solo cuando realmente necesita su funcionalidad adicional , porque aplicar / verificar estas características adicionales (como const de solo escritura) resulta en 'más trabajo '(y nodos de alcance adicionales en el árbol de alcance) para que los motores (actuales) apliquen / verifiquen / verifiquen / configuren.Aquí hay una explicación de la
letpalabra clave con algunos ejemplos.Esta tabla en Wikipedia muestra qué navegadores son compatibles con Javascript 1.7.
Tenga en cuenta que solo los navegadores Mozilla y Chrome lo admiten. IE, Safari y potencialmente otros no.
fuente
letmsdn.microsoft.com/en-us/library/ie/dn342892%28v=vs.85%29.aspxA la respuesta aceptada le falta un punto:
fuente
forinicializador de bucle, reduciendo drásticamente el alcance de la aplicación de las limitaciones delet. VotadoletAlcance del bloque
Las variables declaradas con la
letpalabra clave tienen un alcance de bloque, lo que significa que solo están disponibles en el bloque en el que se declararon.En el nivel superior (fuera de una función)
En el nivel superior, las variables declaradas usando
letno crean propiedades en el objeto global.Dentro de una función
Dentro de una función (pero fuera de un bloque),
lettiene el mismo alcance quevar.Dentro de un bloque
letNo se puede acceder a las variables declaradas usando dentro de un bloque fuera de ese bloque.Dentro de un bucle
Las variables declaradas con
letbucles in solo se pueden referenciar dentro de ese bucle.Lazos con cierres
Si utiliza en
letlugar devaren un bucle, con cada iteración obtendrá una nueva variable. Eso significa que puede usar un cierre de forma segura dentro de un bucle.Zona muerta temporal
Debido a la zona muerta temporal ,
letno se puede acceder a las variables declaradas usando antes de declararlas. Intentar hacerlo arroja un error.No volver a declarar
No puede declarar la misma variable varias veces usando
let. Tampoco puede declarar una variableletcon el mismo identificador que otra variable que se declaró usandovar.constconstes bastante similar a:lettiene un alcance de bloque y tiene TDZ. Sin embargo, hay dos cosas que son diferentes.Sin reasignación
La variable declarada usando
constno se puede reasignar.Tenga en cuenta que no significa que el valor sea inmutable. Sus propiedades aún se pueden cambiar.
Si desea tener un objeto inmutable, debe usarlo
Object.freeze().Se requiere inicializador
Siempre debe especificar un valor al declarar una variable usando
const.fuente
Aquí hay un ejemplo de la diferencia entre los dos (soporte recién iniciado para Chrome):

Como puede ver, la
var jvariable todavía tiene un valor fuera del alcance del bucle for (Block Scope), pero lalet ivariable no está definida fuera del alcance del bucle for.fuente
Existen algunas diferencias sutiles: el
letalcance se comporta más como el alcance variable en más o menos cualquier otro idioma.Por ejemplo, se extiende al bloque que los encierra, no existen antes de ser declarados, etc.
Sin embargo, vale la pena señalar que
letes solo una parte de las nuevas implementaciones de Javascript y tiene diferentes grados de compatibilidad con el navegador .fuente
letestá incluido en el borrador de la sexta edición y probablemente estará en la especificación final.let. Safari, IE y Chome no lo hacen.letno se iza, para usar una variable definida por unaletdefinida en la parte superior de su bloque. Si tiene unaifdeclaración que es más que unas pocas líneas de código, puede olvidar que no puede usar esa variable hasta que se haya definido. GRAN PUNTO !!!letizaremos la variable a la parte superior del bloque. Sin embargo, hacer referencia a la variable en el bloque antes de que la declaración de la variable dé como resultado un Error de referencia (mi nota: en lugar de una buena versión anteriorundefined). La variable está en una 'zona muerta temporal' desde el inicio del bloque hasta que se procese la declaración ". Lo mismo ocurre con las "declaraciones de cambio porque solo hay un bloque subyacente". Fuente: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…La diferencia principal es la diferencia de alcance , mientras que let solo puede estar disponible dentro del alcance que se declara, como en for loop, se puede acceder a var fuera del bucle, por ejemplo. De la documentación en MDN (ejemplos también de MDN):
Además, no olvide que es la función ECMA6, por lo que aún no es totalmente compatible, por lo que es mejor que siempre la transpile a ECMA5 usando Babel, etc. Para obtener más información sobre el sitio web de babel
fuente
Variable sin elevaciónletno se elevará a todo el alcance del bloque en el que aparecen. Por el contrario,varpodría elevarse como se muestra a continuación.En realidad, Per @Bergi, Ambos
varyletson izados .Recolección de basura
El alcance del bloque
letes útil se relaciona con los cierres y la recolección de basura para reclamar memoria. Considerar,La
clickdevolución de llamada del controlador no necesita lahugeDatavariable en absoluto. Teóricamente, después de lasprocess(..)ejecuciones, la enorme estructura de datoshugeDatapodría ser recogida de basura. Sin embargo, es posible que algunos motores JS aún tengan que mantener esta gran estructura, ya queclickfunción tiene un cierre en todo el alcance.Sin embargo, el alcance del bloque puede convertir esta enorme estructura de datos en basura recolectada.
letbuclesleten el bucle puede volver a vincularlo a cada iteración del bucle, asegurándose de reasignarle el valor desde el final de la iteración del bucle anterior. Considerar,Sin embargo, reemplace
varconletDebido a que
letcrea un nuevo entorno léxico con esos nombres para a) la expresión inicializadora b) cada iteración (antes de evaluar la expresión de incremento), hay más detalles aquí .fuente
Aquí hay un ejemplo para agregar a lo que otros ya han escrito. Suponga que desea hacer una matriz de funciones,
adderFunctionsdonde cada función toma un solo argumento de Número y devuelve la suma del argumento y el índice de la función en la matriz. Intentar generaradderFunctionscon un bucle usando lavarpalabra clave no funcionará de la manera ingenua que alguien podría esperar:El proceso anterior no genera la matriz de funciones deseada porque
iel alcance se extiende más allá de la iteración delforbloque en el que se creó cada función. En cambio, al final del ciclo, elicierre en cada función se refiere alivalor de al final del ciclo (1000) para cada función anónima enadderFunctions. Esto no es lo que queríamos en absoluto: ahora tenemos una matriz de 1000 funciones diferentes en la memoria con exactamente el mismo comportamiento. Y si posteriormente actualizamos el valor dei, la mutación afectará a todos losadderFunctions.Sin embargo, podemos intentarlo nuevamente usando la
letpalabra clave:Esta vez,
ise recupera en cada iteración delforbucle. Cada función ahora mantiene el valor deien el momento de la creación de la función y seadderFunctionscomporta como se esperaba.Ahora, mezcla imágenes de los dos comportamientos y probablemente verás por qué no se recomienda mezclar el más nuevo
letyconstel más antiguovaren el mismo script. Hacerlo puede resultar en un código espectacularmente confuso.No dejes que esto te pase a ti. Usa una pelusa.
fuente
let value = i;. Lafordeclaración crea un bloque léxico.La diferencia está en el alcance de las variables declaradas con cada uno.
En la práctica, hay una serie de consecuencias útiles de la diferencia en el alcance:
letlas variables solo son visibles en su bloque de cierre más cercano ({ ... }).letLas variables solo se pueden usar en líneas de código que ocurren después de que se declara la variable (¡aunque se hayan izado !).letlas variables no pueden ser redeclaradas por un posteriorvarolet.letvariables globales no se agregan alwindowobjeto global .letLas variables son fáciles de usar con los cierres (no causan condiciones de carrera ).Las restricciones impuestas por
letreducir la visibilidad de las variables y aumentar la probabilidad de que las colisiones inesperadas de nombres se encuentren temprano. Esto hace que sea más fácil rastrear y razonar sobre las variables, incluida su accesibilidad (lo que ayuda a recuperar la memoria no utilizada).En consecuencia,
letes menos probable que las variables causen problemas cuando se usan en programas grandes o cuando los marcos desarrollados independientemente se combinan de formas nuevas e inesperadas.varaún puede ser útil si está seguro de que desea el efecto de enlace único al usar un cierre en un bucle (# 5) o para declarar variables globales visibles externamente en su código (# 4). El uso devarpara exportaciones puede suplantarse siexportmigra fuera del espacio del transpilador al idioma central.Ejemplos
1. Sin uso fuera del bloque de cierre más cercano: este bloque de código arrojará un error de referencia porque el segundo uso de
xocurre fuera del bloque donde se declara conlet:En contraste, el mismo ejemplo con
varobras.2. Sin uso antes de la declaración:
este bloque de código arrojará un
ReferenceErrorantes de que el código pueda ejecutarse porquexse usa antes de que se declare:Por el contrario, el mismo ejemplo con
varanálisis y ejecuciones sin lanzar ninguna excepción.3. Sin redeclaración: el siguiente código demuestra que una variable declarada con
letno se puede volver a declarar más tarde:4. Globales no vinculados a
window:5. Uso fácil con cierres: las variables declaradas con
varno funcionan bien con cierres dentro de bucles. Aquí hay un bucle simple que genera la secuencia de valores que la variableitiene en diferentes momentos:Específicamente, esto produce:
En JavaScript, a menudo utilizamos variables en un tiempo significativamente más tarde que cuando se crean. Cuando demostramos esto retrasando la salida con un cierre pasado a
setTimeout:... la salida permanece sin cambios mientras nos mantengamos
let. Por el contrario, si hubiéramos usado en suvar ilugar:... el bucle genera inesperadamente "i is 5" cinco veces:
fuente
varlugar delet, el código es equivalente a:var i = 0; while (i < 5) { doSomethingLater(); i++; }iestá fuera del cierre, y para el momento en quedoSomethingLater()se ejecuta,iya se ha incrementado 5 veces, por lo tanto, la salida esi is 5cinco veces. Al usarlet, la variableiestá dentro del cierre, por lo que cada llamada asíncrona obtiene su propia copia enilugar de usar la 'global' que se creó convar.for. Una transformación más precisa, aunque más complicada, es la clásicafor (var i = 0; i < 5; i++) { (function(j) { setTimeout(_ => console.log(i is $ {j}), 125/*ms*/); })(i); }que introduce un "registro de activación de función" para guardar cada valoricon el nombrejdentro de la función.Que las siguientes dos funciones muestren la diferencia:
fuente
letes interesante, porque nos permite hacer algo como esto:Lo que resulta en contar [0, 7].
Mientras
Solo cuenta [0, 1].
fuente
Función VS alcance del bloque:
La principal diferencia entre
varyletes que las variables declaradas convarson de ámbito de función . Mientras que las funciones declaradas conletson de ámbito de bloque . Por ejemplo:variables con
var:Cuando
testVarse llama a la primera función, la variable foo, declarada convar, todavía es accesible fuera de laifinstrucción. Esta variablefooestaría disponible en todas partes dentro del alcance de latestVarfunción .variables con
let:Cuando
testLetse llama a la segunda función, la barra variable, declarada conlet, solo es accesible dentro de laifinstrucción. Porque las variables declaradas conletson de ámbito de bloque (donde un bloque es el código entre llavesif{}, por ejemplofor{},function{}).letlas variables no se izan:Otra diferencia entre
varyletes que las variables con declarado conletno se izan . Un ejemplo es la mejor manera de ilustrar este comportamiento:variables con
letno ser izadas:variables con
vardo get Arbolada:Global
letno se apega awindow:Una variable declarada con
leten el ámbito global (que es código que no está en una función) no se agrega como una propiedad en elwindowobjeto global . Por ejemplo (este código está en alcance global):Utilizar
letmásvarcada vez que pueda, ya que es simplemente cuyo ámbito más específico. Esto reduce los posibles conflictos de nombres que pueden ocurrir cuando se trata con una gran cantidad de variables.varpuede usarse cuando desea que una variable global esté explícitamente en elwindowobjeto (siempre considere cuidadosamente si esto es realmente necesario).fuente
También parece que, al menos en Visual Studio 2015, TypeScript 1.5, "var" permite múltiples declaraciones del mismo nombre de variable en un bloque, y "let" no.
Esto no generará un error de compilación:
Esta voluntad:
fuente
vares la variable de alcance global (con capacidad de elevación).letyconstes el alcance del bloque.fuente
Cuando usas
letLa
letpalabra clave adjunta la declaración de variable al alcance de cualquier bloque (comúnmente un{ .. }par) en el que está contenida. En otras palabras,letsecuestra implícitamente el alcance de cualquier bloque para su declaración de variable.letno se puede acceder a las variables en elwindowobjeto porque no se puede acceder globalmente.Cuando usas
varvary las variables en ES5 tienen ámbitos en las funciones, lo que significa que las variables son válidas dentro de la función y no fuera de la función misma.varSe puede acceder a las variables en elwindowobjeto porque no se puede acceder globalmente.Si quieres saber más sigue leyendo a continuación
Una de las preguntas de entrevista más famosas sobre el alcance también puede ser suficiente para el uso exacto de
letyvarcomo a continuación;Cuando usas
letEsto es porque cuando se usa
let, para cada iteración de bucle, la variable tiene un alcance y tiene su propia copia.Cuando usas
varEsto se debe a que, cuando se usa
var, para cada iteración de bucle, la variable tiene un alcance y una copia compartida.fuente
En términos más básicos,
⚡️ Sandbox para jugar ↓
fuente
Si leo las especificaciones correctamente,
letafortunadamente también se puede aprovechar para evitar las funciones de auto invocación que se usan para simular miembros privados, un patrón de diseño popular que disminuye la legibilidad del código, complica la depuración, que no agrega protección de código real u otro beneficio, excepto tal vez satisfacer a alguien deseo de semántica, así que deja de usarlo. /despotricarConsulte ' Emulación de interfaces privadas '
fuente
lethacen? (Supongo que te refieres a IIFE con "función de auto invocación".)hiddenPropertyen el constructor? Solo hay unohiddenPropertypara todas las instancias en su "clase".Algunos hacks con
let:1)
2)
3)
Getter y setter con
let:fuente
let { type, name, value } = node;? creas un nuevo objeto con 3 propiedades tipo / nombre / valor e inicializas con los valores de propiedades del nodo?var.let vs var. Se trata de alcance .
Las variables var son globales y se puede acceder básicamente a todas partes, mientras que las variables let no son globales y solo existen hasta que un paréntesis de cierre las mata.
Vea mi ejemplo a continuación y observe cómo la variable lion (let) actúa de manera diferente en los dos console.logs; queda fuera de alcance en la segunda consola.log.
fuente
fuente
let es parte de es6. Estas funciones explicarán la diferencia de manera fácil.
fuente
A continuación se muestra cómo 'let' y 'var' son diferentes en el alcance:
El
gfoo, definido porletinicialmente está en el alcance global , y cuando declaramosgfoonuevamente dentro del alcance,if clausesu alcance cambió y cuando se asigna un nuevo valor a la variable dentro de ese alcance, no afecta el alcance global.Mientras que
hfoo, definido porvarestá inicialmente en el alcance global , pero nuevamente cuando lo declaramos dentro delif clause, considera el alcance global hfoo, aunque var se ha utilizado nuevamente para declararlo. Y cuando reasignamos su valor, vemos que el alcance global hfoo también se ve afectado. Esta es la principal diferencia.fuente
Como se ha mencionado más arriba:
Ejemplo 1:
En mis dos ejemplos tengo una función
myfunc.myfunccontiene una variablemyvarigual a 10. En mi primer ejemplo verifico simyvares igual a 10 (myvar==10). En caso afirmativo, debo declarar una variablemyvar(ahora tengo dos variables myvar) usando lavarpalabra clave y asignarle un nuevo valor (20). En la siguiente línea imprimo su valor en mi consola. Después del bloque condicional, imprimo nuevamente el valor demyvaren mi consola. Si nos fijamos en la salida demyfunc,myvartiene un valor igual a 20.Ejemplo2: en mi segundo ejemplo, en lugar de usar la
varpalabra clave en mi bloque condicional, declaro quemyvarusa laletpalabra clave. Ahora cuando llamomyfuncobtengo dos salidas diferentes:myvar=20ymyvar=10.Entonces la diferencia es muy simple, es decir, su alcance.
fuente
Quiero vincular estas palabras clave al contexto de ejecución, porque el contexto de ejecución es importante en todo esto. El contexto de ejecución tiene dos fases: una fase de creación y una fase de ejecución. Además, cada contexto de ejecución tiene un entorno variable y un entorno externo (su entorno léxico).
Durante la fase de creación de un contexto de ejecución, var, let y const todavía almacenarán su variable en la memoria con un valor indefinido en el entorno variable del contexto de ejecución dado. La diferencia está en la fase de ejecución. Si usa una variable de referencia definida con var antes de que se le asigne un valor, simplemente no estará definida. No se planteará ninguna excepción.
Sin embargo, no puede hacer referencia a la variable declarada con let o const hasta que se declare. Si intenta usarlo antes de que se declare, se generará una excepción durante la fase de ejecución del contexto de ejecución. Ahora la variable aún estará en la memoria, cortesía de la Fase de Creación del Contexto de Ejecución, pero el Motor no le permitirá usarla:
Con una variable definida con var, si el motor no puede encontrar la variable en el entorno variable actual del contexto de ejecución, subirá por la cadena de alcance (el entorno externo) y verificará la variable en el entorno variable del entorno externo. Si no puede encontrarlo allí, continuará buscando la cadena de alcance. Este no es el caso con let y const.
La segunda característica de let es que introduce el alcance del bloque. Los bloques están definidos por llaves. Los ejemplos incluyen bloques de funciones, si son bloques, para bloques, etc. Cuando declara una variable con let dentro de un bloque, la variable solo está disponible dentro del bloque. De hecho, cada vez que se ejecuta el bloque, como dentro de un bucle for, creará una nueva variable en la memoria.
ES6 también introduce la palabra clave const para declarar variables. const también tiene un alcance de bloque. La diferencia entre let y const es que las variables const deben declararse utilizando un inicializador, o generará un error.
Y, finalmente, cuando se trata del contexto de ejecución, las variables definidas con var se adjuntarán al objeto 'this'. En el contexto de ejecución global, ese será el objeto de ventana en los navegadores. Este no es el caso de let o const.
fuente
Creo que los términos y la mayoría de los ejemplos son un poco abrumadores. El problema principal que tuve personalmente con la diferencia es entender qué es un "Bloque". En algún momento me di cuenta de que un bloque sería cualquier llave, excepto la
IFdeclaración. un paréntesis{de apertura de una función o bucle definirá un nuevo bloque, cualquier cosa definidaletdentro de él, no estará disponible después del corchete}de cierre de la misma cosa (función o bucle); Con eso en mente, fue más fácil de entender:fuente
Ahora creo que hay un mejor alcance de las variables para un bloque de declaraciones usando
let:Creo que la gente comenzará a usar let here después para que tengan un alcance similar en JavaScript como otros lenguajes, Java, C #, etc.
Las personas que no tenían una comprensión clara sobre el alcance en JavaScript solían cometer el error antes.
La elevación no es compatible con el uso
let.Con este enfoque, los errores presentes en JavaScript se eliminan.
Consulte ES6 en profundidad: let y const para comprenderlo mejor.
fuente
Este artículo define claramente la diferencia entre var, let y const
https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.esmkpbg9b
fuente