Warum wurde der Name 'let' für Variablendeklarationen mit Blockbereich in JavaScript gewählt?

306

Ich verstehe, warum vardieser Name verwendet wird - er ist variabel const-, er ist eine Konstante, aber welche Bedeutung hat der Name für letden aktuellen Block? Kümmer dich nicht darum?

Vitaly Zdanevich
quelle
7
BASIC , 1962 erfunden, verwendet LET. Möglicherweise gibt es frühere Sprachbeispiele.
David R Tribble
5
BASIC wurde 1964 erfunden , nicht 1962. Siehe auch hier . Die Verwendung von LETwird auf Seite 7 des ersten Entwurfs des Handbuchs vom Mai 1964, pdf hier, beschrieben .
Joseph Quinsey
Insbesondere consthandelt es sich um eine konstante oder unveränderliche (schreibgeschützte) Objektreferenz, bei der das Objekt selbst noch veränderbar ist. Z.B. Nach Erklärung / assign const foo = ['bar'], foo.push('bat')wäre immer noch legal, aber foo = ['bar', 'bat']ist es nicht. Aber das ist zu viel Tippen.
user982671

Antworten:

372

Let ist eine mathematische Aussage, die von frühen Programmiersprachen wie Scheme und Basic übernommen wurde. Variablen werden als Entitäten auf niedriger Ebene betrachtet, die nicht für höhere Abstraktionsebenen geeignet sind. Daher möchten viele Sprachdesigner ähnliche, aber leistungsfähigere Konzepte wie in Clojure, F #, Scala einführen, wobei letdies einen Wert oder eine Variable bedeuten kann, die zugewiesen werden kann. aber nicht geändert , wodurch der Compiler mehr Programmierfehler abfängt und den Code besser optimiert.

JavaScript wurde varvon Anfang an verwendet, daher brauchten sie nur ein anderes Schlüsselwort und wurden nur von Dutzenden anderer Sprachen ausgeliehen, die letbereits so weit varwie möglich als traditionelles Schlüsselwort verwendet werden, obwohl in JavaScript letstattdessen eine lokale Variable für den Blockbereich erstellt wird.

exebook
quelle
94
Und die offizielle Mozilla-Dokumentationsseite zitiert diese Seite für diese Frage. Developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra
9
Es ist auch schön len('var') === len('let'), dass Ihre Deklarationen so oder so gut in Ihrem Editor ausgerichtet sind. Ich habe noch nichts gefunden, was darauf hindeutet, dass dies absichtlich war, aber es kann entweder a) optisch ansprechend und lesbarer sein oder b) schrecklich nervig zu debuggen, wenn Sie die beiden mischen (was sowieso eine schlechte Idee zu sein scheint, aber ich ' habe es gesehen).
Brichins
13
Mit anderen Worten, letwurde traditionell verwendet, um eine Konstante zu beschreiben, da let C = the speed of lightJavascript beschlossen hat, let zu verwenden, um eine Variable mit nicht standardmäßigem Gültigkeitsbereich zu beschreiben und gleichzeitig ein anderes Schlüsselwort für Konstanten einzuführen.
Fijiaaron
1
Ich bin anderer Meinung, dass letdas nahe ist var. Auch Scala verwendet nicht, letso dass ich nicht sehe, wie es relevant ist.
Aluan Haddad
3
@fijiaaron: Nicht standardmäßiges Scoping wie? Ist nicht die ganze Funktion, unabhängig davon, in welchem ​​Block Sie sie deklariert haben, von Anfang an seltsam?
SamB
78

Ich denke, es folgt der mathematischen Tradition. In der Mathematik wird oft gesagt "sei x eine beliebige reelle Zahl" oder so.

Tigran Saluev
quelle
Ich bevorzuge diese Antwort eher, da sie kurz und ziemlich nachvollziehbar ist, da wir alle die Algebra durchlaufen haben. Dann sollte wahrscheinlich eine Erklärung folgen, wie sie die anderen hervorheben.
Duduwe
69

Zusätzlich zu exebook Antwort , die Mathematik Verwendung des Stichwortes lassen kapselt auch gut die Scoping Auswirkungen , letwenn sie in Javascript / ES6 verwendet. Genauso wie der folgende ES6-Code die Zuordnung in Klammern nicht kennt, toPrint wenn er den Wert von druckt 'Hello World',

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

let wie in der formalisierten Mathematik verwendet (insbesondere das Schreiben von Beweisen) zeigt an, dass die aktuelle Instanz einer Variablen nur für den Umfang dieser logischen Idee existiert. Im folgenden Beispiel erhält x beim Eingeben der neuen Idee sofort eine neue Identität (normalerweise sind dies Konzepte, die zum Nachweis der Hauptidee erforderlich sind) und kehrt nach Abschluss des Unterbeweises sofort zum alten x zurück. Genau wie beim Codieren wird dies natürlich als etwas verwirrend angesehen und daher normalerweise vermieden, indem ein anderer Name für die andere Variable gewählt wird.

Sei x so und so ...

  Beweiszeug

 Neue Idee {Sei x etwas anderes ... beweise etwas} Schließe eine neue Idee ab

 Beweisen Sie die Hauptidee mit altem x

Evan White
quelle
19
Ich denke das ist wirklich nützlich. Die akzeptierte Antwort ist fast etwas irreführend, da sie davon spricht, dass der Wert nicht geändert werden kann, worum letes überhaupt nicht geht. letdreht sich alles um Umfang.
Jinglesthula
Nur ein Gedanke: letLässt mich an so etwas denken, das im Kopf des Code-Schreibers vor sich geht: "Ok, nur für diesen Moment let foo = bar, aber dann kann es zu seinem ursprünglichen Wert zurückkehren oder aufhören zu sein. Dies ist in genau dargestellt Die Beispiele für Block Scope und Redeclaring Variables in dieser W3Schools-Präsentation von let. Wiederum nicht so tun, als würde ich eine wissenschaftliche Antwort einbringen, sondern diese eher als Gedächtnisstütze teilen, um mich daran zu erinnern, wann ich sie verwenden möchte let.
Alain
Ich denke, es lohnt sich, hier etwas präziser zu sein, um die konzeptionelle Klarheit zu gewährleisten. Ihr Beispiel-ES6-Code "ignoriert die Zuordnung in geschweiften Klammern" nicht. Es führt die Zuweisung wie angewiesen für eine neue Variable aus toPrint, die nur innerhalb des Blocks vorhanden ist , und wirft diese Variable dann pflichtbewusst weg, wenn der Block endet. Und beim Verlassen sind wir wieder im äußeren Bereich, wo das Innere toPrintnicht mehr existiert, also console.log(toPrint)bezieht es sich auf das Äußere toPrint . Es ist nicht so, dass irgendetwas ignoriert wird, es ist nur so, dass letVariablen endliche Lebensdauern haben, die durch ihren Umfang definiert sind.
Februar
1
@FeRD, ausgezeichneter Punkt. Ich habe das oben Gesagte bearbeitet, um die Verwendung des Wortes "ignoriert" zu entfernen, da es den Punkt verschleiert.
Evan White
36

Es macht genau das, was das varmit einem Bereichsunterschied macht. Jetzt kann es den Namen nicht annehmen, varda dieser bereits vergeben ist.

Es sieht also so aus, als hätte es den nächstbesten Namen angenommen, der eine Semantik in einem interessanten englischsprachigen Konstrukt hat.

let myPet = 'dog';

Auf Englisch heißt es "Lass mein Haustier ein Hund sein"

Charlie
quelle
5
Während die Entstehung von let sprachlich und mathematisch sein mag, ist die naheliegende Referenz zweifellos die LET-Aussage in allen Versionen der Programmiersprache BASIC, die viele der Autoren von ES6 zu lernen begonnen hätten, wenn sie vorbei wären 40 Jahre alt
wide_eyed_pupil
5
@wide_eyed_pupil Nur zu Ihrer Information: Als über 40-Jähriger (obwohl kein Autor von ES6), der mit BASIC aufgewachsen ist, hat keine der Communities, an denen ich beteiligt war, LET in der gängigen Praxis verwendet. Wir haben gerade Variablen zugewiesen, wie es Python jetzt tut (z. B. A$="HELLO WORLD"). Zu den beteiligten Interpreten gehörten Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 auf CP / M, Applesoft BASIC und sogar BASCOM, der MS BASIC-Compiler auf CP / M. VAX BASIC hatte LET, benötigte es aber nicht, wie ich mich erinnere. Der Speicher war damals knapp und die 3 oder 4 zusätzlichen Zeichen des Programmtextes pro Anweisung machten einen Unterschied, insbesondere bei "großen" Programmen.
Peter Hull
@PeterHull Das ist interessant, ich habe meine erste Codierung auf mit Bleistift markierten Karten durchgeführt, die an eine digitale CPU angeschlossen sind, dann auf Großrechnern im Forschungslabor des alten Mannes und auf einem digitalen PDP8 in der Schule. Ich habe noch nie gesehen, dass Leute LET verwenden, ohne die Aussage tatsächlich zu verwenden, auch nicht in Büchern, die ich gelesen habe. Wohlgemerkt, ich wurde ermutigt, FORTRAN und PASCAL zu codieren, sobald ich ein gutes, grundlegendes Wesen so schlecht wie es war, nicht einmal GOSUB (dh wiederverwendbare Funktionen) in den von mir verwendeten Versionen zu haben.
wide_eyed_pupil
Sie können eine let-Variable nicht neu deklarieren.
CONvid19
10

Die wahrscheinlichste Möglichkeit ist, dass es die idiomatischste Wahl war. Es ist nicht nur leicht zu sprechen, sondern auch intuitiv zu verstehen. Einige könnten argumentieren, noch mehr als var.

Aber ich denke, das hat etwas mehr Geschichte.

Aus Wikipedia :

Die LCF-Sprache von Dana Scott war ein Stadium in der Entwicklung des Lambda-Kalküls zu modernen funktionalen Sprachen. Diese Sprache führte den let-Ausdruck ein, der seitdem in den meisten funktionalen Sprachen vorkommt.

Zustandsreiche imperative Sprachen wie ALGOL und Pascal implementieren im Wesentlichen einen let-Ausdruck, um einen eingeschränkten Funktionsumfang in Blockstrukturen zu implementieren.

Ich würde gerne glauben, dass dies auch eine Inspiration für das letin Javascript war.

Oxalorg
quelle
Diese Antwort bezieht sich auf den Lambda-Kalkül 'let expression', den das OP vielleicht nicht verlangt hat. Und es scheint später als LETin BASIC von 1964 zu sein.
Joseph Quinsey
Dieser gesamte Artikel ist einer von mehreren Artikeln, die der Wikipedia-Benutzer Thepigdog im Jahr 2014 im Grunde genommen im Alleingang verfasst hat. Ich werde vernünftig sein und nur sagen, dass sie alle aus einer sehr engen Perspektive geschrieben wurden, daher sollte die zitierte (absolut nicht referenzierte) Behauptung lauten interpretiert, dass Scotts Artikel den let-Ausdruck in den Lambda-Kalkül "einführte" , genauso wie ES6 letin JavaScript eingeführt wurde. Nicht ganz falsch, soweit es geht, aber ohne wirkliche Bedeutung. (Und in keiner Weise die Möglichkeit auszuschließen, dass Scotts Verwendung von "let" auch von BASIC inspiriert wurde LET.)
FeRD
1

Let verwendet einen unmittelbareren begrenzten Bereich auf Blockebene, während var normalerweise der Funktionsbereich oder der globale Bereich ist.

Es scheint, dass let höchstwahrscheinlich gewählt wurde, weil es in so vielen anderen Sprachen gefunden wird, um Variablen wie BASIC und viele andere zu definieren.

OG Sean
quelle
1

Ich denke, dass die Verschuldung von JavaScript gegenüber Scheme hier offensichtlich ist. Das Schema hat nicht nur let, sondern auch let *, let * -Werte, let-Syntax und let-Werte. (Siehe The Scheme Programming Language, 4. Aufl.)

((Die Wahl verleiht der Vorstellung, dass JavaScript Lispy ist, aber - bevor wir uns hinreißen lassen - nicht homoikonisch.))))

Eric H.
quelle
1

Es könnte auch so etwas wie "Lexical Environment Type or Tied" bedeuten. Es stört mich, dass es einfach "let this be that " wäre. Und lassen Sie rec im Lambda-Kalkül keinen Sinn ergeben.

Sebastien Paquet
quelle
Ich suchte nach einer Antwort wie dieser. Ich bezweifle auch, dass sie die allgemeine englische Bedeutung von "let" hat
Meenohara