Dlaczego nazwa „let” została wybrana dla deklaracji zmiennych o zasięgu blokowym w JavaScript?


306

Rozumiem, dlaczego varbierze tę nazwę - jest zmienna const- jest stała, ale jakie jest znaczenie nazwy let, która dotyczy bieżącego bloku? Niech będzie?


7
Wykorzystano BASIC , wynaleziony w 1962 r LET. Mogą istnieć wcześniejsze przykłady języków.
David R Tribble,

5
BASIC został wynaleziony w 1964 r. , A nie w 1962 r. Zobacz także tutaj . Zastosowanie LETopisano na stronie 7 pierwszego szkicu instrukcji z maja 1964 r., Pdf tutaj .
Joseph Quinsey

Mówiąc dokładniej, constjest to stałe lub niezmienne (tylko do odczytu) odwołanie do obiektu, w którym sam obiekt jest nadal zmienny. Na przykład. Po deklaracji / assign const foo = ['bar'], foo.push('bat')nadal byłoby legalne, ale foo = ['bar', 'bat']nie jest. Ale to za dużo pisania.
user982671,

Odpowiedzi:


372

Niech jest wyrażeniem matematycznym przyjętym przez języki programowania wczesnego, takie jak Scheme i Basic. Zmienne są uważane za jednostki niskiego poziomu, które nie są odpowiednie dla wyższych poziomów abstrakcji, dlatego pragnienie wielu projektantów języków do wprowadzenia podobnych, ale potężniejszych pojęć, takich jak Clojure, F #, Scala, gdzie letmoże to oznaczać wartość lub zmienną, którą można przypisać, ale bez zmian , co z kolei pozwala kompilatorowi wychwycić więcej błędów programistycznych i lepiej zoptymalizować kod.

JavaScript miał varod samego początku, więc potrzebowali tylko innego słowa kluczowego i właśnie zapożyczyli go z dziesiątek innych języków, które używają letjuż tradycyjnego słowa kluczowego tak blisko, varjak to możliwe, chociaż w JavaScript lettworzy zamiast tego zmienną lokalną o zasięgu blokowym.


94
I oficjalna strona dokumentacji Mozilli cytuje tę stronę dla tego pytania developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra

9
To także miłe len('var') === len('let'), co oznacza, że ​​twoje deklaracje ładnie układają się w edytorze. Nie znalazłem jeszcze niczego, co sugerowałoby, że było to celowe, ale może to być: a) przyjemne wizualnie i bardziej czytelne, lub b) strasznie denerwujące podczas debugowania, jeśli pomieszacie te dwa (co wydaje się złym pomysłem, ale ja ” widziałem to zrobione).
brichins

13
Innymi słowy, lettradycyjnie używany był do opisywania stałej, ponieważ w let C = the speed of lightJavaScript Javascript zdecydował się na użycie let do opisania zmiennej o niestandardowym zakresie, a jednocześnie wprowadzić inne słowo kluczowe dla stałych.
fijiaaron

1
Nie zgadzam się, że letjest blisko var. Również Scala nie używa, letwięc nie widzę, jak to jest istotne.
Aluan Haddad,

3
@fijiaaron: Niestandardowy zakres, w jaki sposób? Czy cała funkcja, niezależnie od tego, co-blok-ty-zadeklarowałeś-to-jest czymś dziwnym na początek?
SamB

78

Myślę, że wynika to z tradycji matematycznej. W matematyce często mówi się „niech x będzie dowolną liczbą rzeczywistą” lub tym podobne.


Bardziej wolę tę odpowiedź, ponieważ jest krótka i dość powiązana, ponieważ wszyscy przeszliśmy przez algebrę, prawdopodobnie po tym powinny pojawić się wyjaśnienia podobne do tego, co wskazują inni.
duduwe

69

Dodając do odpowiedzi exebook , użycie słowa kluczowego w matematyce pozwala również dobrze ujmować implikacje określające zakres, letgdy jest używane w Javascript / ES6. W szczególności, podobnie jak poniższy kod ES6 nie jest świadomy przypisania w nawiasach, toPrint kiedy wypisuje wartość 'Hello World',

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

Niech użyte w sformalizowanej matematyce (zwłaszcza pisaniu dowodów) wskazuje, że bieżąca instancja zmiennej istnieje tylko dla zakresu tej logicznej idei. W poniższym przykładzie x natychmiast zyskuje nową tożsamość po wejściu do nowej idei (zwykle są to koncepcje niezbędne do udowodnienia głównej idei) i wraca natychmiast do starej x po zakończeniu pod-dowodu. Oczywiście, podobnie jak w przypadku kodowania, jest to uważane za nieco mylące i dlatego zwykle można tego uniknąć, wybierając inną nazwę dla innej zmiennej.

Niech x będzie takie a takie ...

  Dowody

 Nowy pomysł {Niech x będzie czymś innym ... udowodnij coś} Zawrzyj nowy pomysł

 Udowodnij główny pomysł starym X


19
Myślę, że to jest naprawdę przydatne. Przyjęta odpowiedź jest prawie trochę myląca, ponieważ mówi o wartości, której nie można zmienić, leto co w ogóle nie chodzi. letchodzi o zakres.
jinglesthula,

Tylko myśl: letkaże mi myśleć o czymś takim, co dzieje się w umyśle twórcy kodu: „Ok, tylko na tę chwilę let foo = bar, ale potem może wrócić do swojej pierwotnej wartości lub przestać być. Jest to dobrze zilustrowane w przykłady zmiennych blokowych i zmiennych redeclaringowych w tej prezentacji W3Schools z let. Ponownie, nie udając, że przynosimy jakąś naukową odpowiedź, ale dzieląc się tym bardziej jako mnemoniczne urządzenie do zapamiętania, kiedy chcę użyć let.
Alain

Myślę, że dla zachowania jasności koncepcyjnej warto tu być nieco bardziej precyzyjnym. Twój przykładowy kod ES6 nie „ignoruje przypisania w nawiasach klamrowych”. Wykonuje przypisanie zgodnie z instrukcją na nowej zmiennej, toPrintktóra istnieje tylko w bloku , a następnie sumiennie wyrzuca tę zmienną po zakończeniu bloku. A po wyjściu z powrotem znajdujemy się w zewnętrznym zasięgu, gdzie wnętrze toPrintjuż nie istnieje, więc console.log(toPrint)odnosi się do zewnętrznego toPrint . Nie jest tak, że cokolwiek jest ignorowane, po prostu letzmienne mają skończone czasy życia zdefiniowane przez ich zakres.
FeRD

1
@FeRD, doskonały punkt. Dokonałem edycji powyższego, aby usunąć użycie słowa „ignoruje”, ponieważ zaciemnia to sens.
Evan White

36

Robi dokładnie to, co varrobi z różnicą zakresu. Teraz nie może przyjąć nazwy, varponieważ jest już zajęta.

Wygląda więc na to, że przyjął kolejną najlepszą nazwę, która ma semantyczną postać w interesującym języku angielskim.

let myPet = 'dog';

W języku angielskim napisane jest „Niech moje zwierzę będzie psem”


5
Chociaż pochodzenie let może być językowe i matematyczne, odniesienie do domu jest niewątpliwie instrukcją LET we wszystkich wersjach języka programowania BASIC, której wielu autorów ES6 zacząłoby się uczyć, gdyby się skończyli 40 lat
wide_eyed_pupil 10.04.17

5
@wide_eyed_pupil Just FYI: jako osoba powyżej 40 roku życia (choć nie autorka ES6), która dorastała w języku BASIC, żadna ze społeczności, z którymi byłam zaangażowana, nie stosowała LET w powszechnej praktyce; właśnie przypisaliśmy zmienne, tak jak teraz Python (np. A$="HELLO WORLD") Zaangażowani tłumacze to Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 na CP / M, Applesoft BASIC, a nawet BASCOM, kompilator MS BASIC na CP / M. VAX BASIC miał LET, ale, jak pamiętam, nie wymagał tego. Pamięć była wtedy napięta, a 3 lub 4 dodatkowe znaki tekstu programu na instrukcję robiły różnicę, szczególnie w „dużych” programach.
Peter Hull

@PeterHull To ciekawe, najpierw napisałem kod na kartkach oznaczonych ołówkiem podłączonych do cyfrowego procesora, potem komputerach mainframe w laboratorium badawczym starego człowieka i cyfrowym PDP8 w szkole. nigdy nie widziałem, żeby ludzie używali LET bez faktycznego użycia oświadczenia, nie w książkach, które czytam. Pamiętajcie, że zachęciłem mnie do kodowania w FORTRAN i PASCAL, gdy tylko dostałem jakieś dobre, podstawowe bycie tak źle, jak to było, nawet nie posiadając GOSUB (tj. Funkcji wielokrotnego użytku) w używanych przeze mnie wersjach.
wide_eyed_pupil

Nie można ponownie ustawić zmiennej let.
CONvid19

10

Najbardziej prawdopodobne jest to, że był to najbardziej idiotyczny wybór. Łatwo jest mówić, ale intuicyjnie go zrozumieć. Niektórzy mogą się kłócić, nawet bardziej niż var.

Ale sądzę, że jest w tym trochę więcej historii.

Z Wikipedii :

Język LCF Dany Scott był etapem ewolucji rachunku lambda na nowoczesne języki funkcjonalne. Ten język wprowadził wyrażenie let, które pojawiło się w większości języków funkcjonalnych od tego czasu.

Pełne stanowe języki imperatywne, takie jak ALGOL i Pascal, zasadniczo implementują wyrażenie let, aby zaimplementować ograniczony zakres funkcji w strukturach blokowych.

Chciałbym wierzyć, że to też była inspiracja dla letJavascript.


Ta odpowiedź odnosi się do rachunku lambda „let expression”, co być może nie jest tym, o co poprosił PO. I wydaje się, że jest później niż LETw języku BASIC z 1964 r.
Joseph Quinsey

Cały ten artykuł jest jednym z kilku napisanych w zasadzie samodzielnie jedną ręką przez użytkownika Wikipedii Thepigdog w 2014 roku. Będę rozsądny i powiem, że wszystkie są napisane z bardzo wąskiej perspektywy, więc cytowane (całkowicie niepowiązane) twierdzenie powinno być interpretowane jako powiedzenie, że praca Scotta „wprowadziła” wyrażenie let do rachunku lambda , w taki sam sposób, jak ES6 wprowadził letdo JavaScript. O ile nie jest to całkowicie nieprawdziwe, ale bez prawdziwego znaczenia. (I w żaden sposób nie wyklucza to, że użycie słowa „let” przez Scotta również zostało zainspirowane przez BASIC LET.)
FeRD

1

Let używa bardziej bezpośredniego zakresu ograniczonego na poziomie bloku, podczas gdy var jest zwykle zasięgiem funkcji lub zasięgiem globalnym.

Wygląda na to, że najprawdopodobniej został wybrany, ponieważ w wielu innych językach można zdefiniować zmienne, takie jak BASIC i wiele innych.


1

Myślę, że zadłużenie JavaScript w Scheme jest tutaj oczywiste. Schemat nie tylko pozwolił, ale pozwolił *, let * -wartości, let-składnia i let-wartości. (Patrz, The Scheme Programming Language, 4th Ed.).

((Wybór dodaje jeszcze większej wiarygodności do pojęcia, że ​​JavaScript to Lispy, ale - zanim nas porwie - nie homoiconic.)))


1

To może również oznaczać coś jak „Lexical typ środowiska lub Tied” .. to denerwuje mnie, że to po prostu być „niech to będzie , że ”. I niech rec nie ma sensu w rachunku lambda.


Szukałem takiej odpowiedzi. Wątpię, by miała ogólne angielskie znaczenie „let”
Meenohara
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.