Perché è stato scelto il nome 'let' per le dichiarazioni di variabili con ambito di blocco in JavaScript?


306

Capisco perché varprende quel nome - è variabile, const- è una costante, ma qual è il significato dietro il nome let, quale ambito per il blocco corrente? Lascia fare?


7
BASIC , inventato nel 1962, usato LET. Potrebbero esserci esempi linguistici precedenti.
David R Tribble

5
BASIC è stato inventato nel 1964 , non nel 1962. Vedi anche qui . L'uso di LETè descritto a pagina 7 della prima bozza del manuale, datata maggio 1964, pdf qui .
Joseph Quinsey,

Più specificamente constè un riferimento a oggetto costante o immutabile (sola lettura) in cui l'oggetto stesso è ancora mutabile. Per esempio. Dopo la dichiarazione / assegnazione const foo = ['bar'], foo.push('bat')sarebbe comunque legale, ma foo = ['bar', 'bat']non lo è. Ma è troppo scrivere.
user982671

Risposte:


372

Let è un'affermazione matematica che è stata adottata dai primi linguaggi di programmazione come Scheme e Basic. Le variabili sono considerate entità di basso livello non adatte a livelli più alti di astrazione, quindi il desiderio di molti progettisti di linguaggi di introdurre concetti simili ma più potenti come in Clojure, F #, Scala, dove letpotrebbe significare un valore o una variabile che può essere assegnata, ma non è cambiato , il che a sua volta consente al compilatore di rilevare più errori di programmazione e ottimizzare meglio il codice.

JavaScript ha avuto vardall'inizio, quindi avevano solo bisogno di un'altra parola chiave e sono stati presi in prestito da dozzine di altre lingue che usano letgià come parola chiave tradizionale il più vicino varpossibile, anche se in JavaScript letcrea invece una variabile locale con ambito di blocco.


94
E la pagina ufficiale della documentazione di Mozilla cita questa pagina per questa domanda developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra,

9
È anche bello len('var') === len('let'), il che significa che le tue dichiarazioni si allineano bene nel tuo editor in entrambi i modi. Non ho ancora trovato nulla che suggerisca che questo fosse intenzionale, ma può essere a) visivamente piacevole e più leggibile, oppure b) orribilmente fastidioso eseguire il debug se mescoli i due (che sembra comunque una cattiva idea, ma io ' l'ho visto fatto).
brichins,

13
In altre parole, letè stato tradizionalmente usato per descrivere una costante, poiché in let C = the speed of lighttal modo Javascript ha deciso di usare let per descrivere una variabile con ambito non standard e allo stesso tempo introdurre un'altra parola chiave per costanti.
fijiaaron

1
Non sono d'accordo che letsia vicino var. Anche Scala non usa, letquindi non vedo quanto sia rilevante.
Aluan Haddad,

3
@fijiaaron: scoping non standard come? L'intera funzione, indipendentemente dal tipo di blocco che hai dichiarato, è forse strana per cominciare?
SamB

78

Immagino che segua la tradizione matematica. In matematica, si dice spesso "lascia che x sia un numero reale arbitrario" o simile.


Preferisco di più questa risposta poiché è breve e abbastanza correlabile mentre attraversavamo tutti l'algebra, quindi probabilmente dovrebbe essere seguita da una spiegazione come ciò che gli altri stanno sottolineando.
duduwe,

69

Aggiungendo alla risposta dell'exbook , l'uso matematico della parola chiave lascia incapsulare bene anche le implicazioni di scoping di letquando usato in Javascript / ES6. In particolare, proprio come il seguente codice ES6 non è a conoscenza dell'assegnazione tra parentesi graffe di toPrint quando stampa il valore di 'Hello World',

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

let come usato in matematica formalizzata (in particolare la scrittura di prove) indica che l'attuale istanza di una variabile esiste solo per lo scopo di quell'idea logica. Nell'esempio seguente, x ottiene immediatamente una nuova identità entrando nella nuova idea (di solito si tratta di concetti necessari per dimostrare l'idea principale) e torna immediatamente alla vecchia x al termine della sottotest. Naturalmente, proprio come nella codifica, questo è considerato un po 'confuso e quindi di solito viene evitato scegliendo un nome diverso per l'altra variabile.

Lascia che x sia così e così ...

  Roba di prova

 Nuova idea {Lascia che x sia qualcos'altro ... prova qualcosa} Concludi nuova idea

 Prova l'idea principale con la vecchia x


19
Penso che questo sia davvero utile. La risposta accettata è quasi un po 'fuorviante, in quanto parla del valore che non può essere modificato, che non è affatto ciò di cui letsi tratta. letsi tratta di portata.
jinglesthula,

Solo un pensiero: letmi fa pensare a qualcosa del genere che accade nella mente dello scrittore di codice, "Ok, solo per questo momento let foo = bar, ma poi può tornare al suo valore originale o smettere di esistere. Questo è ben illustrato in gli esempi per il blocco Campo di applicazione e Redeclaring le variabili in questo W3Schools presentazione di let. Anche in questo caso, non fingendo di portare in una risposta scientifica di qualche tipo, ma la condivisione di questo più come un dispositivo mnemonico per ricordare quando voglio usare let.
Alain

Penso che valga la pena essere leggermente più preciso qui, per motivi di chiarezza concettuale. Il tuo codice ES6 di esempio non "ignora l'assegnazione tra parentesi graffe". Esegue l'assegnazione secondo le istruzioni, su una nuova variabile toPrintche esiste solo all'interno del blocco , quindi getta via via quella variabile alla fine del blocco. E all'uscita, siamo di nuovo nel campo di applicazione esterno, dove l'interno toPrintnon esiste più, quindi si console.log(toPrint)riferisce all'esterno toPrint . Non è che nulla sia ignorato, è solo che le letvariabili hanno vite finite definite dal loro ambito.
FeRD

1
@FeRD, punto eccellente. Ho apportato una modifica a quanto sopra per rimuovere l'uso della parola "ignora" in quanto offusca il punto.
Evan White il

36

Fa esattamente quello che varfa con una differenza di portata. Ora non può prendere il nome varpoiché è già stato preso.

Quindi sembra che abbia preso il prossimo miglior nome che ha una semantica in un interessante costrutto in lingua inglese.

let myPet = 'dog';

In inglese si dice "Lascia che il mio animale domestico sia un cane"


5
Mentre l'origine di let può essere linguistica e matematica, il riferimento vicino alla casa è senza dubbio la dichiarazione LET in tutte le versioni del linguaggio di programmazione BASIC, uno che molti degli autori di ES6 avrebbero iniziato a imparare se fossero finiti 40 anni
wide_eyed_pupil

5
@wide_eyed_pupil Solo FYI: come over 40 (anche se non autore di ES6) cresciuto su BASIC, nessuna delle comunità con cui sono stato coinvolto ha usato LET nella pratica comune; abbiamo appena assegnato delle variabili, come Python ora (ad es. A$="HELLO WORLD") Gli interpreti coinvolti includevano Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 su CP / M, Applesoft BASIC e persino BASCOM, il compilatore MS BASIC su CP / M. VAX BASIC aveva LET, ma non lo richiedeva, come ricordo. Allora la memoria era ridotta e i 3 o 4 caratteri extra del testo del programma per istruzione facevano la differenza, specialmente nei programmi "grandi".
Peter Hull,

@PeterHull Questo è interessante, ho fatto la mia prima codifica su carte segnate a matita attaccate a una CPU digitale, quindi a mainframe presso il laboratorio di ricerca del vecchio e un PDP8 digitale a scuola. mai una volta ho visto le persone usare LET senza effettivamente usare la dichiarazione, nemmeno nei libri che ho letto. Intendiamoci, sono stato incoraggiato a scrivere il codice in FORTRAN e PASCAL non appena ho ottenuto qualcosa di buono, di base essendo così cattivo come era, senza avere GOSUB (ovvero funzioni riutilizzabili) nelle versioni che ho usato.
wide_eyed_pupil

Non è possibile dichiarare nuovamente una variabile let.
CONvid19

10

La possibilità più probabile è che sia stata la scelta più idiomatica. Non solo è facile da parlare, ma piuttosto intuitivo da capire. Alcuni potrebbero discutere, anche più di così var.

Ma credo che ci sia un po 'più di storia in questo.

Da Wikipedia :

Il linguaggio LCF di Dana Scott è stato un palcoscenico nell'evoluzione del calcolo lambda in linguaggi funzionali moderni. Questo linguaggio ha introdotto l'espressione let, che è apparsa nella maggior parte dei linguaggi funzionali da allora.

Linguaggi imperativi pieni di stato come ALGOL e Pascal implementano essenzialmente un'espressione let, per implementare un ambito ristretto di funzioni, in strutture a blocchi.

Vorrei credere che anche questa fosse un'ispirazione per letJavascript.


Questa risposta si riferisce al calcolo lambda "let expression", che forse non è quello che l'OP ha chiesto. E sembra essere più tardi rispetto LETa BASIC, dal 1964.
Joseph Quinsey,

L'intero articolo è uno dei tanti scritti praticamente da solo dall'utente di Wikipedia Thepigdog nel 2014. Sarò giudizioso e dirò solo che sono tutti scritti da una prospettiva molto ristretta, quindi l'affermazione (assolutamente senza riferimento) citata dovrebbe essere interpretato dicendo che l'articolo di Scott "introdusse" l'espressione let nel calcolo lambda , allo stesso modo in cui ES6 introdusse letJavaScript. Non completamente falso, per quanto va, ma senza alcun significato reale. (E non in alcun modo escludere la possibilità che l'uso di Scott di "lasciare" è stato anche ispirato da BASIC LET.)
Ferd

1

Consenti utilizza un ambito limitato a livello di blocco più immediato, mentre var è in genere un ambito di funzione o un ambito globale.

Sembra che sia stato scelto molto probabilmente perché si trova in così tante altre lingue per definire variabili, come BASIC, e molte altre.


1

Penso che l'indebitamento di JavaScript verso Scheme sia evidente qui. Lo schema non solo ha lasciato, ma ha lasciato *, let * -values, let-syntax e let-valori. (Vedi, The Scheme Programming Language, 4th Ed.).

((La scelta aggiunge ulteriore credenza all'idea che JavaScript sia Lispy, ma - prima che ci lasciamo trasportare - non omoiconico.))))


1

Potrebbe anche qualcosa di dire come "lessicale ambiente Tipo o legato" .. mi da fastidio che sarebbe semplicemente "lasciare questo sia quello ". E lasciare che rec non abbia senso nel calcolo lambda.


Stavo cercando una risposta come questa, anche io dubito che abbia il significato inglese generale di "let"
Meenohara
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.