¿Por qué se eligió el nombre 'let' para las declaraciones de variables de ámbito de bloque en JavaScript?

306

Entiendo por qué vartoma ese nombre, es variable, constes una constante, pero ¿cuál es el significado detrás del nombre let, que abarca el bloque actual? ¿Déjalo ser?

Vitaly Zdanevich
fuente
77
BÁSICO , inventado en 1962, usado LET. Puede haber ejemplos de idiomas anteriores.
David R Tribble
55
BASIC fue inventado en 1964 , no en 1962. Ver también aquí . El uso de LETse describe en la página 7 del primer borrador del manual, con fecha de mayo de 1964, pdf aquí .
Joseph Quinsey
Más específicamente, constes una referencia de objeto constante o inmutable (solo lectura) donde el objeto en sí todavía es mutable. P.ej. Después de la declaración / asignación const foo = ['bar'], foo.push('bat')aún sería legal, pero foo = ['bar', 'bat']no lo es. Pero eso es demasiado escribir.
user982671

Respuestas:

372

Let es una declaración matemática que fue adoptada por los primeros lenguajes de programación como Scheme y Basic. Las variables se consideran entidades de bajo nivel que no son adecuadas para niveles superiores de abstracción, por lo tanto, el deseo de muchos diseñadores de idiomas de introducir conceptos similares pero más potentes como en Clojure, F #, Scala, donde letpodría significar un valor o una variable que se puede asignar, pero no cambiado , lo que a su vez permite que el compilador detecte más errores de programación y optimice mejor el código.

JavaScript ha tenido vardesde el principio, por lo que solo necesitaban otra palabra clave, y solo tomaron prestados de docenas de otros idiomas que letya usan como palabra clave tradicional lo más cerca varposible, aunque en JavaScript letcrea una variable local de alcance de bloque en su lugar.

exebook
fuente
94
Y la página oficial de documentación de Mozilla cita esta página para esta pregunta developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra
99
También es bueno eso len('var') === len('let'), lo que significa que tus declaraciones se alinean muy bien en tu editor de cualquier manera. Todavía no he encontrado nada que sugiera que esto fue deliberado, pero puede ser a) visualmente agradable y más legible, o b) horriblemente molesto de depurar si mezclas los dos (lo que parece una mala idea de todos modos, pero yo ' Lo he visto hecho).
brichins
13
En otras palabras, letse ha usado tradicionalmente para describir una constante, ya let C = the speed of lightque Javascript decidió usar let para describir una variable con alcance no estándar y al mismo tiempo introducir otra palabra clave para constantes.
fijiaaron
1
No estoy de acuerdo con que letesté cerca var. También Scala no usa, letasí que no veo cómo es relevante.
Aluan Haddad
3
@fijiaaron: ¿Cómo es el alcance no estándar? ¿No es un poco extraño para empezar la función completa independientemente de qué bloque lo declaraste?
SamB
78

Supongo que sigue la tradición matemática. En matemáticas, a menudo se dice "sea x un número real arbitrario" o algo así.

Tigran Saluev
fuente
Prefiero esta respuesta más, ya que es breve y bastante identificable, ya que todos pasamos por el álgebra, luego probablemente debería seguir una explicación como lo que los otros están señalando.
duduwe
69

Además de la respuesta de exebook , el uso matemático de la palabra clave también permite encapsular bien las implicaciones de alcance letcuando se usa en Javascript / ES6. Específicamente, así como el siguiente código ES6 no conoce la asignación entre paréntesis de toPrint cuándo imprime el valor de 'Hello World',

let toPrint = 'Hello World.';
{
    let toPrint = 'Goodbye World.';
}
console.log(toPrint); // Prints 'Hello World'

dejar como se usa en las matemáticas formalizadas (especialmente la escritura de pruebas) indica que la instancia actual de una variable existe solo para el alcance de esa idea lógica. En el siguiente ejemplo, x inmediatamente adquiere una nueva identidad al ingresar a la nueva idea (por lo general, estos son conceptos necesarios para probar la idea principal) y vuelve inmediatamente a la x anterior al concluir la sub-prueba. Por supuesto, al igual que en la codificación, esto se considera algo confuso y, por lo general, se evita eligiendo un nombre diferente para la otra variable.

Deje x ser tal y tal ...

  Cosas de prueba

 Nueva idea {Sea x otra cosa ... pruebe algo} Concluya una nueva idea

 Demuestre la idea principal con la vieja x

Evan White
fuente
19
Creo que esto es realmente útil. La respuesta aceptada es casi un poco engañosa, ya que habla sobre el valor que no se puede cambiar, que no es de lo que letse trata en absoluto. letse trata de alcance.
jinglesthula
Solo un pensamiento: letme hace pensar en algo como esto que está sucediendo en la mente del escritor del código, "Ok, por solo este momento let foo = bar, pero luego puede volver a su valor original o dejar de serlo. Esto se ilustra claramente en los ejemplos para Block Scope y Redeclaring Variables en esta presentación de W3Schools de let. Nuevamente, no pretendiendo traer una respuesta científica de algún tipo, sino compartiendo esto más como un dispositivo mnemónico para recordar cuándo quiero usar let.
Alain
Creo que vale la pena ser un poco más preciso aquí, en aras de la claridad conceptual. Su código ES6 de ejemplo no "ignora la asignación entre llaves". Realiza la asignación según las instrucciones, en una nueva variable toPrintque solo existe dentro del bloque , y luego descarta esa variable cuando termina el bloque. Y al salir, volvemos al ámbito externo, donde lo interno toPrintya no existe, por lo que se console.log(toPrint)refiere a lo externo toPrint . No se ignora nada, es solo que las letvariables tienen vidas finitas definidas por su alcance.
FeRD
1
@FeRD, excelente punto. He hecho una edición a lo anterior para eliminar el uso de la palabra "ignora", ya que ofusca el punto.
Evan White
36

Hace exactamente lo que varhace con una diferencia de alcance. Ahora no puede tomar el nombre varya que ya está en uso.

Por lo tanto, parece que ha tomado el siguiente mejor nombre que tiene una semántica en una construcción interesante del idioma inglés.

let myPet = 'dog';

En inglés dice "Deja que mi mascota sea un perro"

Charlie
fuente
55
Si bien el origen de let puede ser lingüístico y matemático, la referencia cercana al hogar es, sin duda, la declaración LET en todas las versiones del lenguaje de programación BASIC, una que muchos de los autores de ES6 habrían comenzado a aprender si hubieran terminado 40 años
wide_eyed_pupil
55
@wide_eyed_pupil Solo para tu información: como mayor de 40 años (aunque no autor de ES6) que creció en BASIC, ninguna de las comunidades con las que estuve involucrado usaba LET en la práctica común; acabamos de asignar variables, como lo hace Python ahora (por ejemplo A$="HELLO WORLD") Los intérpretes involucrados incluyeron Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 en CP / M, Applesoft BASIC e incluso BASCOM, el compilador MS BASIC en CP / M. VAX BASIC tenía LET, pero no lo requiero, según recuerdo. La memoria era escasa en ese entonces, y los 3 o 4 caracteres adicionales del texto del programa por declaración marcaron la diferencia, especialmente en los programas "grandes".
Peter Hull
@PeterHull Eso es interesante, hice mi primera codificación en tarjetas marcadas con lápiz conectadas a una CPU digital, luego mainframes en el laboratorio de investigación del viejo y un PDP8 digital en la escuela. Nunca vi a la gente usar LET sin usar la declaración, tampoco en los libros que leo. Tenga en cuenta que me animaron a codificar en FORTRAN y PASCAL tan pronto como obtuve algo bueno, lo básico era tan malo como era, ni siquiera tenía GOSUB (es decir, funciones reutilizables) en las versiones que utilicé.
wide_eyed_pupil
No puede volver a declarar una variable let.
CONvid19
10

La posibilidad más probable es que fue la elección más idiomática. No solo es fácil de hablar, sino más bien intuitivo de entender. Algunos podrían discutir, incluso más que eso var.

Pero creo que hay un poco más de historia en esto.

De Wikipedia :

El lenguaje LCF de Dana Scott fue una etapa en la evolución del cálculo lambda en lenguajes funcionales modernos. Este lenguaje introdujo la expresión let, que ha aparecido en la mayoría de los lenguajes funcionales desde entonces.

Los lenguajes imperativos de estado completo como ALGOL y Pascal esencialmente implementan una expresión let, para implementar un alcance restringido de funciones, en estructuras de bloques.

Me gustaría creer que esto también fue una inspiración, para letJavascript.

oxalorg
fuente
Esta respuesta se refiere al cálculo lambda 'let expression', que quizás no sea lo que solicitó el OP. Y parece ser más tarde que LETen BASIC, desde 1964.
Joseph Quinsey
Todo el artículo es uno de varios escritos básicamente en solitario por el usuario de Wikipedia Thepigdog en 2014. Seré prudente y solo diré que todos están escritos desde una perspectiva muy estrecha, por lo que el reclamo (totalmente sin referencia) citado debería ser interpretado como diciendo que el artículo de Scott "introdujo" la expresión let al cálculo lambda , de la misma manera que ES6 introdujo leta JavaScript. No completamente falso, hasta donde llega, pero sin ningún significado real. (Y de ninguna manera descarta la posibilidad de que el uso de Scott de "let" también haya sido inspirado por BASIC LET.)
FeRD
1

Let utiliza un alcance limitado de nivel de bloque más inmediato, mientras que var es típicamente el alcance de la función o el alcance global.

Parece que let fue elegido con mayor probabilidad porque se encuentra en muchos otros idiomas para definir variables, como BASIC y muchos otros.

OG Sean
fuente
1

Creo que el endeudamiento de JavaScript con Scheme es obvio aquí. El esquema no solo tiene let, sino que también tiene valores *, let *, sintaxis let y valores let. (Ver, El lenguaje de programación del esquema, 4ª ed.).

((La elección agrega más credibilidad a la noción de que JavaScript es Lispy, pero, antes de dejarnos llevar, no es homicónico))))

Eric H.
fuente
1

También podría significar algo así como "léxico Tipo Medio Ambiente o atado" .. Me molesta que simplemente sería "dejar que esta sea que ". Y dejar que rec no tenga sentido en el cálculo lambda.

Sebastien Paquet
fuente
Estaba buscando una respuesta como esta, también dudo que tenga el significado general en inglés de "let"
Meenohara