¿Hay alguna razón para usar la palabra clave "var" en ES6?

242
La guía de ES6 de Babel dice:

  

let es el nuevo var .

Aparentemente, la única diferencia es que var se ajusta a la función actual , mientras que let se ajusta al bloque actual . Hay algunos buenos ejemplos en esta respuesta .

No puedo ver ninguna razón para usar var en el código ES6. Incluso si desea extender una variable dada a toda la función, puede hacerlo con let colocando la declaración en la parte superior del bloque de función, que es lo que debería hacer con var de todos modos para indicar el valor real. alcance. Y si quieres abarcar algo más fino en un bloque for o algo así, también puedes hacerlo.

Así que mi instinto es dejar de usar var al escribir el código ES6.

Mi pregunta es, ¿estoy equivocado acerca de esto? ¿Hay algún caso legítimo en el que var sería preferible a let ?

    
pregunta callum 24.02.2015 - 23:08

5 respuestas

200

Doug Crockford analiza let en este punto en su charla, " Las mejores partes ".

El punto es, let evita una fuente de malentendidos, esp. para programadores con expectativas establecidas por lenguajes con alcance de bloque. Un var tiene alcance de función (declara una variable que es visible a través de la función) a pesar de que parece como si tuviera alcance de bloque .

var posiblemente aún podría ser útil en un caso extremo como el código generado por una máquina, pero me estoy estirando mucho.

( const también es nuevo y tiene un ámbito de bloqueo. Después de let x = {'hi': 'SE'} puede reasignar a x , mientras que después de const y = x no puede reasignar a y . Eso es a menudo preferible ya que evita que algo cambie accidentalmente Fuera de ti. Pero para ser claro, todavía puedes modificar el objeto y.hi = 'SO' a menos que lo congeles.)

De manera realista, su impresión es correcta para ES6: Adopte let y const . Deja de usar var .

(En otro rendimiento de "The Better Parts" , Doug dice por qué se agregó === en lugar de arreglando los problemas de == . == produce algunos resultados "sorprendentes", por lo que simplemente adopte === .)


Un ejemplo revelador

Mozilla Developer Network da un ejemplo donde var no funciona según lo previsto. Su ejemplo es uno realista que establece onclick handlers en una página web. Aquí hay un caso de prueba más pequeño:

var a = [];
(function () {
   'use strict';
   for (let i = 0; i < 5; ++i) { // *** 'let' works as expected ***
     a.push( function() {return i;} );
   }
} ());
console.log(a.map( function(f) {return f();} ));
// prints [0, 1, 2, 3, 4]

// Start over, but change 'let' to 'var'.
// prints [5, 5, 5, 5, 5]

var nos falla porque todas las iteraciones de bucle comparten la misma función i variable de función, que tiene el valor 5 después de que finalice el bucle.

    
respondido por el Jerry101 24.02.2015 - 23:58
8

Si ha estado escribiendo el código correcto, probablemente podrá convertir todas las declaraciones var en declaraciones let sin ningún cambio semántico.

let es preferible porque reduce el alcance en el que un identificador es visible. Nos permite declarar con seguridad variables en el sitio de primer uso.

const es preferible a let . A menos que necesite mutar una referencia, use una declaración const . Esto tiene todos los beneficios de let además de reducir la presencia de variables unificadas y hacer que el código sea más fácil de razonar. Si no está seguro de que deba mutar una referencia, declare const hasta que tenga la necesidad explícita de hacerlo.

    
respondido por el Aluan Haddad 26.06.2016 - 07:53
4

No necesariamente creo que estés equivocado, pero hay advertencias en el uso de var. Esencialmente, let debería ayudar a los desarrolladores a sortear la estupidez de JavaScript, particularmente con los conflictos de nombres. Al parecer, var tiene un alcance mayor, ya que quiere ir al alcance de la función de cierre. Habrá ocasiones en las 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, preferir let sobre var ayudará a los desarrolladores con conflictos de nombres. En una nota más clara, es hora de que ES6 presente let .

    
respondido por el curiousdork 24.02.2015 - 23:40
1

Tiendo a aceptar que solo se debe usar "let" en es6. AFIK, redeclarar un "let" genera un error (lo que es bueno), mientras que con "var", simplemente anula el valor (aunque el "modo estricto" en es5 también se encarga de eso).

    
respondido por el yar1 10.01.2016 - 20:26
-4

let significa "dejar variable igual". Es una declaración, en otras palabras, una inicialización y asignación.

Existe en contraste con const que por supuesto significa "constante", que es lo opuesto a variable.

Algunos otros idiomas usan un prefijo para el objeto real en lugar del objeto cuando lo declaran (por ejemplo, def es una abreviatura para "definir función" - falta el punto de lo que está siendo "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 "dejar" es asignar memoria.

El problema surge porque la palabra clave var se introdujo antes de que se admitiera const , por lo que la compatibilidad con versiones anteriores determina que var no significa necesariamente 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 asegurarnos de que recordemos que, de manera léxica, esto está mal, también decidieron cambiar el alcance léxico de let vs var , por lo que la inconsistencia es lo más importante en nuestras mentes al momento de la depuración.

En otras palabras, let existe porque las personas (es decir, los mantenedores del lenguaje) pensaron que Javascript era demasiado coherente, ya que dominaron todos sus modismos e idiosincrasias, desean más.

Nota al margen, var no funciona en los bloques de "flecha" si desea tratar dichos bloques como cierres (porque se introdujo var antes de tratar los bloques como cierres), pero let sí lo hace.

    
respondido por el fijiaaron 08.02.2016 - 20:33

Lea otras preguntas en las etiquetas