2016-06-20 11 views

risposta

207

Let è una dichiarazione matematica che è stato adottato da linguaggi di programmazione come primi 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 let potrebbe significare un valore o una variabile che può essere assegnato, ma non modificato, che a sua volta consente al compilatore di rilevare più errori di programmazione e ottimizzare il codice in modo migliore. JavaScript ha avuto var dall'inizio, quindi hanno solo bisogno di un'altra parola chiave e sono stati presi in prestito da dozzine di altre lingue che usano let già come una parola chiave tradizionale il più vicino possibile a var, sebbene in JavaScript let crei invece la variabile locale dell'ambito del blocco.

+3

ben spiegato. – gani

+25

E la pagina ufficiale di Documentazione di Mozilla cita questa pagina per questa domanda https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let – SarathChandra

+2

È anche bello che '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 sia stato intenzionale, ma può essere a) visivamente piacevole e più leggibile, o b) orribilmente fastidioso di eseguire il debug se si mescolano i due (che comunque sembra una cattiva idea, ma io l'ho visto fare). – brichins

49

Immagino che segua la tradizione matematica. In matematica, è spesso detto "sia x essere un numero reale arbitrario" o così.

29

Fa esattamente ciò che fa var con una differenza di ambito. Ora non può prendere il nome var dal momento che è già stato preso.

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

let myPet = 'dog'; 

In inglese si dice "Che il mio animale domestico essere un cane"

+3

Mentre l'origine di let può essere linguistica e matematica, il riferimento da vicino a casa è senza dubbio l'istruzione LET in tutte le versioni del linguaggio di programmazione BASIC, una che molti degli autori di ES6 avrebbero iniziato a studiare se fossero oltre 40 anni. –

+3

@wide_eyed_pupil Solo FYI: come un over 40 (anche se non un autore di ES6) che è cresciuto in BASIC, nessuna delle comunità con cui sono stato coinvolto ha utilizzato LET nella pratica comune; abbiamo appena assegnato delle variabili, come fa ora Python (es. 'A $ =" HELLO WORLD "') Gli interpreti coinvolti includevano Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 su CP/M, Applesoft BASIC e anche BASCOM, MS BASIC compilatore su CP/M. VAX BASIC aveva LET, ma non lo richiedeva, come ricordo. La memoria allora era ristretta, e i 3 o 4 caratteri in più del testo del programma per dichiarazione fecero la differenza, specialmente nei programmi "grandi". –

+0

@PeterHull Questo è interessante, ho fatto la mia prima codifica su schede segnate a matita collegate a una CPU digitale, quindi mainframe al laboratorio di ricerca del vecchio uomo e un PDP8 digitale a scuola. mai una volta ho visto le persone usare LET senza usare effettivamente la frase, non nei libri che ho letto. Intendiamoci che sono stato incoraggiato a programmare in FORTRAN e PASCAL non appena ho avuto una buona base, essendo così male come prima, senza nemmeno avere GOSUB (cioè funzioni riutilizzabili) nelle versioni che ho usato. –

8

La possibilità più probabile è che fosse la scelta più idiomatica. Non solo è facile parlare, ma è piuttosto intuitivo da capire. Alcuni potrebbero obiettare, anche più di var.

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

Da wikipedia:

di Dana Scott lingua LCF stata una tappa nell'evoluzione del lambda calcolo in moderni linguaggi funzionali. Questo linguaggio ha introdotto l'espressione let, che è apparsa nella maggior parte delle lingue funzionali da quel momento.

I linguaggi imperativi di stato come ALGOL e Pascal implementano essenzialmente un'espressione let, per implementare un ambito limitato di funzioni, in strutture a blocchi.

Mi piacerebbe credere che anche questa fosse un'ispirazione, per lo let in Javascript.

26

Aggiungendo alla exebook's response, l'utilizzo di matematica della parola chiave diamo incapsula bene anche le implicazioni di scoping let quando viene utilizzato in Javascript/ES6.Nello specifico, come il seguente codice ES6 ignora l'assegnazione di coppie di toPrint e 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 (soprattutto la scrittura delle prove) indica che l'istanza corrente di una variabile esiste solo per lo scopo di quell'idea logica. Nell'esempio seguente, x acquisisce immediatamente una nuova identità entrando nella nuova idea (solitamente questi sono concetti necessari per dimostrare l'idea principale) e ritorna immediatamente alla vecchia x alla conclusione della sub-prova. Naturalmente, proprio come nella codifica, questo è considerato un po 'confuso e quindi viene solitamente evitato scegliendo un nome diverso per l'altra variabile.

Sia x così e così ...

  roba Proof

  New Idea {Sia x essere qualcos'altro ... dimostrare qualcosa} Concludere New Idea

  Provare l'idea principale con il vecchio x

+4

Penso che questo sia davvero utile. La risposta accettata è quasi fuorviante, in quanto parla del valore che non può essere modificato, il che non è affatto il "let". 'let' è tutto per portata. – jinglesthula

0

Consente di utilizzare un ambito limitato a livello di blocco più immediato mentre var è l'ambito di funzione o ambito globale in genere.

Sembra che sia stato scelto molto probabilmente perché è stato trovato in così tanti altri linguaggi per definire variabili, come BASIC e molte altre.

1

Le variabili dichiarate da let hanno come ambito il blocco in cui sono definite, nonché in qualsiasi sotto-blocco contenuto. In questo modo, lascia che funzioni molto come var. La differenza principale è che l'ambito di una variabile var è l'intera funzione di chiusura. Vedi alcuni esempi qui sotto.

function varTest() { 
    var x = 1; 
    if (true) { 
    var x = 2; // same variable! 
    console.log(x); // 2 
    } 
    console.log(x); // 2 
} 

function letTest() { 
    let x = 1; 
    if (true) { 
    let x = 2; // different variable 
    console.log(x); // 2 
    } 
    console.log(x); // 1 
} 
Problemi correlati