La guía de Babel para ES6 dice:
let
Es lo nuevovar
.
Aparentemente, la única diferencia es que var
se limita a la función actual , mientras que let
se limita al bloque actual . Hay algunos buenos ejemplos en esta respuesta .
No veo ninguna razón para usar var
en el código ES6. Incluso si desea abarcar una variable dada a toda la función, puede hacerlo let
colocando la declaración en la parte superior del bloque de funciones, que es lo que debería hacer de var
todos modos para indicar el alcance real. Y si quieres ver algo más fino en un for
bloque o algo, entonces puedes hacerlo también.
Entonces, mi instinto es dejar de usar por var
completo al escribir el código ES6.
Mi pregunta es, ¿estoy equivocado sobre esto? ¿Hay algún caso legítimo donde var
sería preferible let
?
fuente
var
como un indicador consciente de que esta variable está destinada a toda la función podría ser una convención útil de "autodocumentación" .let
declaración justo en la parte superior de una función, creo que es igual de obvio que tenía la intención de abarcarla a toda la función. No creo que usarlo lovar
haga más claro que simplemente ubicarlo en la parte superior.var
aún existe es la compatibilidad con versiones anteriores. Si no fuera por eso, se habrían eliminado porvar
completo, o nunca se habrían presentadolet
en primer lugar, en cambio, cambiarían la semánticavar
a lo que podría decirse que debería haber sido todo el tiempo.var
parecen débiles, y no lo suficiente como para garantizar tener un tercer tipo de variable que salta a la vista. Puede abarcarlet
a una función completa simplemente colocándola en la parte superior de la función, que tiene una intención mucho más clara que escribirvar
en un bloque (para que se levante de ese bloque para que luego pueda usarlo fuera del bloque - extraño). Advierte que si usted abarcalet
a una función, entonces "es solo la posición la que señala la diferencia, en lugar de la sintaxis", pero creo que eso es algo bueno.var
. Los ejemplos que presenta para mantenerlosvar
parecen artificiales, y se basan en graves errores de codificación. ¡Es mucho mejor encontrarse con un error y verse obligado a corregir dichos errores que usar funciones de lenguaje que le permitan salirse con la suya! ¿Qué sigue, aconseje envolver todo en un intento / captura para evitar accidentes? El resto de ese enlace es bueno, pero no estoy de acuerdo con esa parte en particular.Respuestas:
Doug Crockford discute
let
en este momento en su charla, " Las mejores partes ".El punto es que
let
evita una fuente de malentendidos, especialmente. para programadores con expectativas establecidas por lenguajes con alcance de bloque. Avar
tiene alcance de función (declara una variable que es visible en toda la función) aunque parezca que tiene alcance de bloque .var
Es posible que aún sea útil en un caso extremo como el código generado por máquina, pero me estoy estirando mucho allí.(
const
también es nuevo y tiene un alcance de bloque. Después delet x = {'hi': 'SE'}
que pueda reasignar ax
, mientras que después deconst y = x
que no pueda reasignar ay
. Eso a menudo es preferible ya que evita que algo cambie accidentalmente debajo de usted. Pero para ser claros, aún puede modificar el objeto ay.hi = 'SO'
menos que congelarlo.)Siendo realistas, su impresión es correcta para ES6: adoptar
let
yconst
. Deja de usarvar
.(En otra presentación de "The Better Parts" , Doug dice por qué
===
se agregó en lugar de solucionar los problemas de==
.==
Produce algunos resultados "sorprendentes", así que simplemente adopte===
).Un ejemplo revelador
Mozilla Developer Network ofrece un ejemplo en el
var
que no funciona según lo previsto. Su ejemplo es realista y estableceonclick
controladores en una página web. Aquí hay un caso de prueba más pequeño:var
nos falla porque todas las iteraciones de bucle comparten la mismai
variable con ámbito de función , que tiene el valor una vez que5
finaliza el bucle.fuente
==
No está roto en absoluto. Simplemente se puede definir comoequality comparison using coersion
Echa un vistazo a 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
yvar
sino entrelet
,var
yconst
var
funciona según lo diseñado, pero no cuántas personas esperan. Es un error de usabilidad, no un error de implementación.Si ha estado escribiendo el código correcto, probablemente podrá convertir todas las
var
declaraciones enlet
declaraciones sin ningún cambio semántico.let
es preferible porque reduce el alcance en el que un identificador es visible. Nos permite declarar variables de forma segura en el sitio de primer uso.const
es preferiblelet
. A menos que necesite mutar una referencia, use unaconst
declaración. Esto tiene todos los beneficios delet
reducir la presencia de variables unitarias y hacer que el código sea más fácil de razonar. Si no está seguro de si necesitará mutar una referencia, declareconst
hasta que tenga que hacerlo explícitamente.fuente
No creo necesariamente que estés equivocado, pero hay advertencias para usar var. Esencialmente,
let
debería ayudar a los desarrolladores a sortear la estupidez de JavaScript, particularmente con los conflictos de nombres.var
, al parecer, tiene un alcance mayor ya que quiere ir al alcance de la función de cierre. Habrá momentos en los que necesite var, como cuando necesite que una variable temporal esté disponible dentro del alcance de un bloque dentro de una función; de lo contrario, preferirlet
a var ayudará a los desarrolladores a resolver conflictos de nombres. En una nota más ligera, ya es hora de que se presente ES6let
.fuente
var
en un bloque está disponible dentro de toda la función, no en ámbito de bloque. Es una característica engañosa.Tiendo a estar de acuerdo en que solo "let" debe usarse en es6. AFIK, volver a declarar un "let" genera un error (que es bueno), mientras que con "var", simplemente anula el valor (aunque el "modo estricto" en es5 también se encarga de eso).
fuente
let
significa "dejar variable igual". Es una declaración, en otras palabras, una inicialización y asignación.Existe en contraste con lo
const
que, por supuesto, significa "constante", que es lo contrario de variable.Algunos otros lenguajes usan un prefijo para el objeto real en lugar del objeto cuando lo declaran (por ejemplo,
def
es una abreviatura de "definir función" - falta por completo el punto de lo que se está "def".Let
agrega esta inconsistencia semántica a Javascript.Lógicamente, también puede permitir que una constante sea igual a algo, ya que el trabajo de la palabra clave "let" es asignar memoria.
El problema surge porque la
var
palabra clave que se introdujo antesconst
era compatible, por lo que la compatibilidad con versiones anteriores dicta quevar
no necesariamente significa una variable. (También podría usarse para asignar un valor constante).Por lo tanto, la introducción de
let
en la posición incorrecta. Para asegurarse de que recordamos que léxicamente, esto está mal, también decidieron cambiar el alcance léxico delet
vsvar
, por lo que la inconsistencia es lo más importante en nuestras mentes al depurar.En otras palabras,
let
existe porque las personas (es decir, los mantenedores del lenguaje) pensaban que Javascript era demasiado consistente, habiendo dominado todos sus modismos e idiosincrasias, desean más.Nota al margen,
var
no funciona en bloques de "flecha" si desea tratar dichos bloques como cierres (porquevar
se introdujo antes de tratar los bloques como cierres), pero lolet
hace.fuente
let
porque está en desacuerdo con el tono de otras palabras clave en la misma categoría en JavaScript. Aún así, esto no responde a la pregunta, y no está particularmente bien planteado. Votado a favorlet
No solo los desarrolladores desean más complejidad. En realidad, es intuitivamente más comprensible, porque cuando realiza un bucle y cierra sobre vars, el cierre mantiene el último valor de la var, pero cuando hace lo mismo sobre let, cada cierre en el bucle tiene su propio valor para let, un el ejemplo de @ Jerry101 arriba