Introducción de ECMAScript 6 la let
declaració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 let
usar var
?
let
se 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
var
palabra clave tienen un alcance en el cuerpo de la función inmediata (de ahí el alcance de la función) mientras que laslet
variables tienen un alcance en el bloque de cierre inmediato denotado por{ }
(de ahí el alcance del bloque).La razón por la cual
let
se 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: 3
se 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
var
palabra clave son izadas (inicializadasundefined
antes 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:let
Las 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,
var
le permitirá volver a declarar la misma variable en el mismo ámbito mientraslet
genera un SyntaxError.fuente
let
la expresión de bloquelet (variable declaration) statement
no es estándar y se eliminará en el futuro, bugzilla.mozilla.org/show_bug.cgi?id=1023609 .let
Tambié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
i
variable 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
i
como argumento. Tales problemas también se pueden evitar ahora utilizando en sulet
lugarvar
como 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ómolet
se supone que debe comportarse?let
serí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 locali
en cada iteración.¿Cuál es la diferencia entre
let
yvar
?var
declaración se conoce en toda la función en la que se define, desde el inicio de la función. (*)let
declaració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
j
solo se conoce en el primer bucle for, pero no antes y después. Sin embargo, nuestra variablei
es 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
let
hoy?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
let
declaració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
let
declaració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
let
declaració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
let
declaració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
let
nada:Cómo realizar un seguimiento del soporte del navegador
Para obtener una descripción actualizada de qué navegadores admiten la
let
declaración al momento de leer esta respuesta, consulte estaCan I Use
pá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
i
ES conocido en todas partes en el bloque de funciones! ¡Comienza comoundefined
(debido al izado) hasta que asignes un valor! ps:let
también se iza (en la parte superior del bloque que contiene), pero dará unReferenceError
cuando 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!let
yvar
!let
yconst
se 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
let
palabra 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
let
msdn.microsoft.com/en-us/library/ie/dn342892%28v=vs.85%29.aspxA la respuesta aceptada le falta un punto:
fuente
for
inicializador de bucle, reduciendo drásticamente el alcance de la aplicación de las limitaciones delet
. Votadolet
Alcance del bloque
Las variables declaradas con la
let
palabra 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
let
no crean propiedades en el objeto global.Dentro de una función
Dentro de una función (pero fuera de un bloque),
let
tiene el mismo alcance quevar
.Dentro de un bloque
let
No se puede acceder a las variables declaradas usando dentro de un bloque fuera de ese bloque.Dentro de un bucle
Las variables declaradas con
let
bucles in solo se pueden referenciar dentro de ese bucle.Lazos con cierres
Si utiliza en
let
lugar devar
en 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 ,
let
no 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 variablelet
con el mismo identificador que otra variable que se declaró usandovar
.const
const
es bastante similar a:let
tiene un alcance de bloque y tiene TDZ. Sin embargo, hay dos cosas que son diferentes.Sin reasignación
La variable declarada usando
const
no 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 j
variable todavía tiene un valor fuera del alcance del bucle for (Block Scope), pero lalet i
variable no está definida fuera del alcance del bucle for.fuente
Existen algunas diferencias sutiles: el
let
alcance 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
let
es solo una parte de las nuevas implementaciones de Javascript y tiene diferentes grados de compatibilidad con el navegador .fuente
let
está 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.let
no se iza, para usar una variable definida por unalet
definida en la parte superior de su bloque. Si tiene unaif
declaració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 !!!let
izaremos 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ónlet
no se elevará a todo el alcance del bloque en el que aparecen. Por el contrario,var
podría elevarse como se muestra a continuación.En realidad, Per @Bergi, Ambos
var
ylet
son izados .Recolección de basura
El alcance del bloque
let
es útil se relaciona con los cierres y la recolección de basura para reclamar memoria. Considerar,La
click
devolución de llamada del controlador no necesita lahugeData
variable en absoluto. Teóricamente, después de lasprocess(..)
ejecuciones, la enorme estructura de datoshugeData
podría ser recogida de basura. Sin embargo, es posible que algunos motores JS aún tengan que mantener esta gran estructura, ya queclick
función tiene un cierre en todo el alcance.Sin embargo, el alcance del bloque puede convertir esta enorme estructura de datos en basura recolectada.
let
bucleslet
en 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
var
conlet
Debido a que
let
crea 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,
adderFunctions
donde 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 generaradderFunctions
con un bucle usando lavar
palabra clave no funcionará de la manera ingenua que alguien podría esperar:El proceso anterior no genera la matriz de funciones deseada porque
i
el alcance se extiende más allá de la iteración delfor
bloque en el que se creó cada función. En cambio, al final del ciclo, eli
cierre en cada función se refiere ali
valor 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
let
palabra clave:Esta vez,
i
se recupera en cada iteración delfor
bucle. Cada función ahora mantiene el valor dei
en el momento de la creación de la función y seadderFunctions
comporta 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
let
yconst
el más antiguovar
en 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;
. Lafor
declaració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:
let
las variables solo son visibles en su bloque de cierre más cercano ({ ... }
).let
Las 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 !).let
las variables no pueden ser redeclaradas por un posteriorvar
olet
.let
variables globales no se agregan alwindow
objeto global .let
Las variables son fáciles de usar con los cierres (no causan condiciones de carrera ).Las restricciones impuestas por
let
reducir 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,
let
es 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.var
aú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 devar
para exportaciones puede suplantarse siexport
migra 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
x
ocurre fuera del bloque donde se declara conlet
:En contraste, el mismo ejemplo con
var
obras.2. Sin uso antes de la declaración:
este bloque de código arrojará un
ReferenceError
antes de que el código pueda ejecutarse porquex
se usa antes de que se declare:Por el contrario, el mismo ejemplo con
var
análisis y ejecuciones sin lanzar ninguna excepción.3. Sin redeclaración: el siguiente código demuestra que una variable declarada con
let
no se puede volver a declarar más tarde:4. Globales no vinculados a
window
:5. Uso fácil con cierres: las variables declaradas con
var
no funcionan bien con cierres dentro de bucles. Aquí hay un bucle simple que genera la secuencia de valores que la variablei
tiene 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 i
lugar:... el bucle genera inesperadamente "i is 5" cinco veces:
fuente
var
lugar delet
, el código es equivalente a:var i = 0; while (i < 5) { doSomethingLater(); i++; }
i
está fuera del cierre, y para el momento en quedoSomethingLater()
se ejecuta,i
ya se ha incrementado 5 veces, por lo tanto, la salida esi is 5
cinco veces. Al usarlet
, la variablei
está dentro del cierre, por lo que cada llamada asíncrona obtiene su propia copia eni
lugar 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 valori
con el nombrej
dentro de la función.Que las siguientes dos funciones muestren la diferencia:
fuente
let
es 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
var
ylet
es que las variables declaradas convar
son de ámbito de función . Mientras que las funciones declaradas conlet
son de ámbito de bloque . Por ejemplo:variables con
var
:Cuando
testVar
se llama a la primera función, la variable foo, declarada convar
, todavía es accesible fuera de laif
instrucción. Esta variablefoo
estaría disponible en todas partes dentro del alcance de latestVar
función .variables con
let
:Cuando
testLet
se llama a la segunda función, la barra variable, declarada conlet
, solo es accesible dentro de laif
instrucción. Porque las variables declaradas conlet
son de ámbito de bloque (donde un bloque es el código entre llavesif{}
, por ejemplofor{}
,function{}
).let
las variables no se izan:Otra diferencia entre
var
ylet
es que las variables con declarado conlet
no se izan . Un ejemplo es la mejor manera de ilustrar este comportamiento:variables con
let
no ser izadas:variables con
var
do get Arbolada:Global
let
no se apega awindow
:Una variable declarada con
let
en el ámbito global (que es código que no está en una función) no se agrega como una propiedad en elwindow
objeto global . Por ejemplo (este código está en alcance global):Utilizar
let
másvar
cada 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.var
puede usarse cuando desea que una variable global esté explícitamente en elwindow
objeto (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
var
es la variable de alcance global (con capacidad de elevación).let
yconst
es el alcance del bloque.fuente
Cuando usas
let
La
let
palabra clave adjunta la declaración de variable al alcance de cualquier bloque (comúnmente un{ .. }
par) en el que está contenida. En otras palabras,let
secuestra implícitamente el alcance de cualquier bloque para su declaración de variable.let
no se puede acceder a las variables en elwindow
objeto porque no se puede acceder globalmente.Cuando usas
var
var
y 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.var
Se puede acceder a las variables en elwindow
objeto 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
let
yvar
como a continuación;Cuando usas
let
Esto es porque cuando se usa
let
, para cada iteración de bucle, la variable tiene un alcance y tiene su propia copia.Cuando usas
var
Esto 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,
let
afortunadamente 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
let
hacen? (Supongo que te refieres a IIFE con "función de auto invocación".)hiddenProperty
en el constructor? Solo hay unohiddenProperty
para 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 porlet
inicialmente está en el alcance global , y cuando declaramosgfoo
nuevamente dentro del alcance,if clause
su 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 porvar
está 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
.myfunc
contiene una variablemyvar
igual a 10. En mi primer ejemplo verifico simyvar
es igual a 10 (myvar==10
). En caso afirmativo, debo declarar una variablemyvar
(ahora tengo dos variables myvar) usando lavar
palabra 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 demyvar
en mi consola. Si nos fijamos en la salida demyfunc
,myvar
tiene un valor igual a 20.Ejemplo2: en mi segundo ejemplo, en lugar de usar la
var
palabra clave en mi bloque condicional, declaro quemyvar
usa lalet
palabra clave. Ahora cuando llamomyfunc
obtengo dos salidas diferentes:myvar=20
ymyvar=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
IF
declaración. un paréntesis{
de apertura de una función o bucle definirá un nuevo bloque, cualquier cosa definidalet
dentro 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