La guía de Babel para ES6 dice:
letEs lo nuevovar.
Aparentemente, la única diferencia es que varse limita a la función actual , mientras que letse limita al bloque actual . Hay algunos buenos ejemplos en esta respuesta .
No veo ninguna razón para usar varen el código ES6. Incluso si desea abarcar una variable dada a toda la función, puede hacerlo letcolocando la declaración en la parte superior del bloque de funciones, que es lo que debería hacer de vartodos modos para indicar el alcance real. Y si quieres ver algo más fino en un forbloque o algo, entonces puedes hacerlo también.
Entonces, mi instinto es dejar de usar por varcompleto al escribir el código ES6.
Mi pregunta es, ¿estoy equivocado sobre esto? ¿Hay algún caso legítimo donde varsería preferible let?
fuente

varcomo un indicador consciente de que esta variable está destinada a toda la función podría ser una convención útil de "autodocumentación" .letdeclaració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 lovarhaga más claro que simplemente ubicarlo en la parte superior.varaún existe es la compatibilidad con versiones anteriores. Si no fuera por eso, se habrían eliminado porvarcompleto, o nunca se habrían presentadoleten primer lugar, en cambio, cambiarían la semánticavara lo que podría decirse que debería haber sido todo el tiempo.varparecen débiles, y no lo suficiente como para garantizar tener un tercer tipo de variable que salta a la vista. Puede abarcarleta 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 escribirvaren un bloque (para que se levante de ese bloque para que luego pueda usarlo fuera del bloque - extraño). Advierte que si usted abarcaleta 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 mantenerlosvarparecen 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
leten este momento en su charla, " Las mejores partes ".El punto es que
letevita una fuente de malentendidos, especialmente. para programadores con expectativas establecidas por lenguajes con alcance de bloque. Avartiene alcance de función (declara una variable que es visible en toda la función) aunque parezca que tiene alcance de bloque .varEs posible que aún sea útil en un caso extremo como el código generado por máquina, pero me estoy estirando mucho allí.(
consttambié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 = xque 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
letyconst. 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
varque no funciona según lo previsto. Su ejemplo es realista y estableceonclickcontroladores en una página web. Aquí hay un caso de prueba más pequeño:varnos falla porque todas las iteraciones de bucle comparten la mismaivariable con ámbito de función , que tiene el valor una vez que5finaliza el bucle.fuente
==No está roto en absoluto. Simplemente se puede definir comoequality comparison using coersionEcha 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] ]letyvarsino entrelet,varyconstvarfunciona 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
vardeclaraciones enletdeclaraciones sin ningún cambio semántico.letes 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.constes preferiblelet. A menos que necesite mutar una referencia, use unaconstdeclaración. Esto tiene todos los beneficios deletreducir 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, declareconsthasta que tenga que hacerlo explícitamente.fuente
No creo necesariamente que estés equivocado, pero hay advertencias para usar var. Esencialmente,
letdeberí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, preferirleta 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
varen 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
letsignifica "dejar variable igual". Es una declaración, en otras palabras, una inicialización y asignación.Existe en contraste con lo
constque, 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,
defes una abreviatura de "definir función" - falta por completo el punto de lo que se está "def".Letagrega 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
varpalabra clave que se introdujo antesconstera compatible, por lo que la compatibilidad con versiones anteriores dicta quevarno necesariamente significa una variable. (También podría usarse para asignar un valor constante).Por lo tanto, la introducción de
leten la posición incorrecta. Para asegurarse de que recordamos que léxicamente, esto está mal, también decidieron cambiar el alcance léxico deletvsvar, por lo que la inconsistencia es lo más importante en nuestras mentes al depurar.En otras palabras,
letexiste 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,
varno funciona en bloques de "flecha" si desea tratar dichos bloques como cierres (porquevarse introdujo antes de tratar los bloques como cierres), pero lolethace.fuente
letporque 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 favorletNo 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