TinselCity

¿Por qué existen tanto var como let?

Pregunta: ¿Por qué existen tanto var como let en JavaScript? Y como pregunta de bonus: ¿No podríamos quedarnos solo con let?

Retro-compatibilidad

Inicialmente existía var. El alcance de las variables se delimitaba solo a nivel de función (i.e. no existía alcance de bloque (un bucle, un condicional…)). Y además el diseño del lenguaje indicaba que la ejecución tenía una primera pasada de análisis léxico en la que se recolectaban (hoisting) todas las definiciones de nombres (variables y funciones).

Todos en el bosque eran felices… Bueno, no, había bastantes conejos malhumorados con dos temas. Uno era el tema del alcance de bloque, que por algún motivo parece que lo necesitaban para… algo. Y luego estaba el tema del hoisting que por un lado hacía llorar a algunos y por otro, aunque no se hubieran percatado excesivamente de su existencia, confundía a otros cuando lo oían nombrar.

Así, después de muchos años se introdujo let como un apañ^H^H^H^Halternativa que permitía restringir el alcance a bloques y que no “sufría hoisting”… Bueno, no, para hacer que encaje con la filosofía del lenguaje, let simula que no hay recolección, aunque sí la haya, haciendo un juego de manos con la recolección introduciendo una TDZ 1) para imponer la forward declaration.

Ahora bien, ¿no podríamos entonces quedarnos solo con let (o simplemente cambiar el comportamiento de var sin introducir una nueva palabra)? No, claro que no. Por un lado está el tema de la retro-compatibilidad y de no romper automáticamente la mitad o más de las páginas web del mundo solo porque te moleste que haya dos palabras en lugar de una. Por otro, let introduce sus propias preocupaciones (el rendimiento, por ejemplo, es inevitablemente entre 5 y 10 veces peor; y el uso de las TDZs tampoco parece la solución perfecta).

Hay quien prefiere ignorar esto y decir que desde ya todo el mundo debería usar siempre let y que quien use var es una mala persona. ¯\_(ツ)_/¯

1)
Temporal Dead Zone