Por que o nome 'let' foi escolhido para declarações de variáveis ​​com escopo de bloco em JavaScript?


306

Eu entendo por varque leva esse nome - é variável, const- é uma constante, mas qual é o significado por trás do nome let, com escopos para o bloco atual? Deixe ser?


7
BASIC , inventado em 1962, usado LET. Pode haver exemplos de idiomas anteriores.
precisa

5
O BASIC foi inventado em 1964 , não em 1962. Veja também aqui . O uso de LETestá descrito na página 7 do primeiro rascunho do manual, datado de maio de 1964, em pdf aqui .
Joseph Quinsey 27/03

Mais especificamente, consté uma referência de objeto constante ou imutável (somente leitura) em que o próprio objeto ainda é mutável. Por exemplo. Após a declaração / atribuição const foo = ['bar'], foo.push('bat')ainda seria legal, mas foo = ['bar', 'bat']não é. Mas isso é muita digitação.
User982671

Respostas:


372

Let é uma afirmação matemática que foi adotada pelas linguagens de programação iniciais, como Scheme e Basic. As variáveis ​​são consideradas entidades de baixo nível não adequadas para níveis mais altos de abstração, portanto, o desejo de muitos designers de linguagem de introduzir conceitos semelhantes, mas mais poderosos, como Clojure, F #, Scala, onde letpode significar um valor ou uma variável que pode ser atribuída, mas não mudou , o que, por sua vez, permite ao compilador detectar mais erros de programação e otimizar melhor o código.

O JavaScript teve vardesde o início, então eles só precisavam de outra palavra-chave e apenas pediram emprestado de dezenas de outros idiomas que letjá usam a palavra-chave tradicional o mais próximo varpossível, embora, no JavaScript, letcrie uma variável local do escopo do bloco.


94
E a página oficial da documentação do Mozilla cita esta página para esta pergunta developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra

9
Também é bom len('var') === len('let'), o que significa que suas declarações se alinham muito bem no seu editor de qualquer maneira. Ainda não encontrei nada que sugira que isso foi deliberado, mas pode ser: a) visualmente agradável e mais legível, ou b) terrivelmente irritante para depurar se você misturar os dois (o que parece ser uma má ideia, mas eu também '' já vi isso feito).
Brichins # 25/17

13
Em outras palavras, lettem sido tradicionalmente usado para descrever uma constante, pois let C = the speed of lighto Javascript decidiu usar let para descrever uma variável com escopo não padrão e, ao mesmo tempo, introduzir outra palavra-chave para constantes.
Fijiaaron 9/0318

1
Eu discordo que leté próximo var. Scala também não usa, letentão não vejo como isso é relevante.
Aluan Haddad

3
@fijiaaron: Escopo fora do padrão, como? Não é estranho começar com toda a função, independentemente do bloco que você declarou?
SamB 04/04/19

78

Eu acho que segue a tradição matemática. Em matemática, costuma-se dizer "seja x um número real arbitrário" ou algo assim.


Prefiro mais essa resposta, pois ela é breve e bastante compreensível, pois todos nós passamos pela álgebra, então provavelmente deve ser seguida de uma explicação como o que os outros estão apontando.
duduwe 21/04

69

Adicionando à resposta do exebook , o uso matemático da palavra-chave let também encapsula bem as implicações de escopo de letquando usado em Javascript / ES6. Especificamente, assim como o código ES6 a seguir não está ciente da atribuição entre chaves de toPrint quando ele imprime o valor de 'Hello World',

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

let usado na matemática formalizada (especialmente a redação de provas) indica que a instância atual de uma variável existe apenas para o escopo dessa ideia lógica. No exemplo a seguir, x imediatamente ganha uma nova identidade ao inserir a nova idéia (geralmente esses são conceitos necessários para provar a idéia principal) e reverte imediatamente para o antigo x após a conclusão da subprova. Obviamente, assim como na codificação, isso é considerado um pouco confuso e, portanto, geralmente é evitado escolhendo um nome diferente para a outra variável.

Seja x assim e tão ...

  Material de prova

 Nova idéia {Seja x outra coisa ... prove alguma coisa} Conclua nova idéia

 Prove a idéia principal com o x antigo


19
Eu acho que isso é realmente útil. A resposta aceita é quase um pouco enganadora, pois fala sobre o valor de não poder ser alterado, e não leté disso que se trata. leté tudo sobre escopo.
Jinglesthula

Apenas um pensamento: letme faz pensar em algo como isso acontecendo na mente do redator de código: "Ok, neste exato momento let foo = bar, mas ele pode voltar ao seu valor original ou deixar de existir. Isso é claramente ilustrado em os exemplos para escopo de bloco e redeclaring Variáveis em este W3Schools apresentação de let. mais uma vez, não pretendendo trazer uma resposta científica de algum tipo, mas compartilhar isso mais como um dispositivo mnemônico para recordar quando eu quero usar let.
Alain

Acho que vale a pena ser um pouco mais preciso aqui, por uma questão de clareza conceitual. Seu exemplo de código ES6 não "ignora a atribuição entre chaves". Ele executa a atribuição conforme as instruções, em uma nova variável toPrintque existe apenas dentro do bloco e, em seguida, joga fora essa variável quando o bloco termina. E na saída, estamos de volta ao escopo externo, onde o interior toPrintnão existe mais, portanto, console.log(toPrint)refere-se ao externo toPrint . Não é que nada seja ignorado, é apenas que as letvariáveis ​​têm vida útil definida por seu escopo.
FeRD 13/01

1
@FeRD, excelente ponto. Fiz uma edição acima para remover o uso da palavra "ignora", uma vez que ofusca o argumento.
Evan White

36

Ele faz exatamente o que varfaz com uma diferença de escopo. Agora, ele não pode receber o nome, varpois ele já foi usado.

Portanto, parece que ele adotou o próximo melhor nome, que tem uma semântica em uma construção interessante no idioma inglês.

let myPet = 'dog';

Em inglês, diz "Deixe meu animal de estimação ser um cachorro"


5
Embora a origem de let possa ser lingüística e matemática, a referência próxima a casa é sem dúvida a instrução LET em todas as versões da linguagem de programação BASIC, uma que muitos dos autores do ES6 teriam começado a aprender se terminassem 40 anos.
wide_eyed_pupil

5
@wide_eyed_pupil Just FYI: com mais de 40 anos (embora não seja um autor do ES6) que cresceu no BASIC, nenhuma das comunidades com as quais eu estava envolvido usava LET na prática comum; acabamos de atribuir variáveis, como o Python faz agora (por exemplo A$="HELLO WORLD"). Os intérpretes envolvidos incluíam o Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 no CP / M, Applesoft BASIC e até BASCOM, o compilador MS BASIC no CP / M. VAX BASIC tinha LET, mas não exigia, pelo que me lembro. A memória estava fraca naquela época, e os 3 ou 4 caracteres extras do texto do programa por instrução fizeram a diferença, especialmente em programas "grandes".
Peter Hull

@ PeterHull Isso é interessante, eu fiz minha primeira codificação em cartões marcados a lápis conectados a uma CPU Digital, depois a mainframes no laboratório de pesquisa do velho e um PDP8 Digital na escola. nunca vi as pessoas usarem LET sem usar a declaração, nem nos livros que li. Lembre-se de que fui encorajado a codificar em FORTRAN e PASCAL assim que obtive algo bom, básico, tão ruim quanto era, sem ter o GOSUB (ou seja, funções reutilizáveis) nas versões que eu usei.
23418 Wide_eyed_pupil

Você não pode redeclarar uma variável let.
CONvid19 03/03

10

A possibilidade mais provável é que foi a escolha mais idiomática. Não é fácil falar, mas também intuitivo. Alguns poderiam argumentar, ainda mais que isso var.

Mas acho que há um pouco mais de história nisso.

Da Wikipedia :

A linguagem LCF de Dana Scott foi um estágio na evolução do cálculo lambda para as linguagens funcionais modernas. Essa linguagem introduziu a expressão let, que apareceu na maioria das linguagens funcionais desde então.

Linguagens imperativas cheias de estado, como ALGOL e Pascal, implementam essencialmente uma expressão let, para implementar o escopo restrito de funções, em estruturas de blocos.

Gostaria de acreditar que isso também foi uma inspiração para o letJavascript.


Essa resposta se refere ao cálculo lambda 'let expression', que talvez não seja o que o OP pediu. E parece ser mais tarde do que LETno BASIC, de 1964.
Joseph Quinsey 27/03

Esse artigo inteiro é um dos vários escritos basicamente por uma só pessoa pelo usuário da Wikipedia Thepigdog em 2014. Serei criterioso e apenas digo que todos eles foram escritos de uma perspectiva muito estreita, portanto a alegação (totalmente não referenciada) citada deve ser interpretou como dizendo que o artigo de Scott "introduziu" a expressão let no cálculo lambda , da mesma maneira que o ES6 introduziu letno JavaScript. Não completamente falso, na medida em que vai, mas sem qualquer significado real. (E de maneira alguma descartando a possibilidade de o uso de "let" por Scott também ter sido inspirado pelo BASIC LET.)
FeRD

1

Let usa um escopo limitado em nível de bloco mais imediato, enquanto var é escopo de função ou escopo global.

Parece que let foi escolhido com maior probabilidade porque é encontrado em muitas outras linguagens para definir variáveis, como BASIC, e muitas outras.


1

Eu acho que o endividamento do JavaScript para o Scheme é óbvio aqui. O esquema não apenas permitiu, mas permitiu valores *, let *, sintaxe let e valores let. (Veja, The Scheme Programming Language, 4ª Ed.).

((A escolha adiciona mais credibilidade à noção de que o JavaScript é Lispy, mas - antes de nos deixarmos levar - não é homoicônico.))))


1

Também poderia significar algo como "Lexical Environment Type or Tied". Me incomoda que simplesmente seja "deixe isto ser aquilo ". E deixar rec não faria sentido no cálculo lambda.


Eu estava procurando por uma resposta como essa eu também duvido que tenha o significado geral em inglês de "let"
Meenohara 16/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.