Чому для оголошень змінної блоку в змінному JavaScript було вибрано ім'я "нехай"?


306

Я розумію, чому varприймає це ім'я - воно є змінним, const- це константа, але яке значення має ім'я let, яке стосується поточного блоку? Нехай так буде?


7
BASIC , винайдений у 1962 р., Б / в LET. Можуть бути і більш ранні мовні приклади.
David R Tribble

5
Основа була винайдена в 1964 році , а не в 1962 році. Дивіться також тут . Використання LETописується на сторінці 7 першого проекту посібника від травня 1964 р., Pdf тут .
Джозеф Квінсі

Більш конкретно const- це постійна або незмінна (лише для читання) посилання на об'єкт, де сам об'єкт все ще змінюється. Напр. Після оголошення / правонаступника const foo = ['bar'], по- foo.push('bat'), як і раніше буде законним, але foo = ['bar', 'bat']це не так . Але це занадто багато вводити.
користувач982671

Відповіді:


372

Нехай це математичне твердження, яке було прийняте такими мовами раннього програмування, як Scheme та Basic. Змінні вважаються суб'єктами низького рівня, не придатними для більш високих рівнів абстракції, тому бажання багатьох дизайнерів мови запровадити подібні, але більш потужні поняття, такі як Clojure, F #, Scala, де це letможе означати значення або змінну, яку можна призначити, але не змінено , що в свою чергу дозволяє компілятору вловлювати більше помилок програмування та краще оптимізувати код.

JavaScript був varз самого початку, тому їм просто потрібно було ще одне ключове слово, а також просто запозичене з десятків інших мов, які використовують letяк традиційне ключове слово якомога ближче var, хоча в JavaScript letстворюється блокова локальна змінна.


94
І офіційна сторінка документації Mozilla цитує цю сторінку для цього питання developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Сарат Чандра

9
Це також приємно, що len('var') === len('let')означає, що ваші декларації в будь-якому випадку вишикуються в редакторі. Я ще не знайшов нічого, що б припустити, що це було навмисно, але це може бути а) візуально приємним і читабельнішим, або б) жахливо прикрою налагодженням, якщо ви змішаєте це два (що все одно здається поганою ідеєю, але я " я бачив це зроблено).
бричінс

13
Іншими словами, letтрадиційно використовується для опису константи, let C = the speed of lightтому що Javascript вирішив використовувати для опису змінної з нестандартним масштабуванням і в той же час ввести ще одне ключове слово для констант.
fijiaaron

1
Я не згоден, що letце близько var. Також Scala не використовує, letтому я не бачу, наскільки це актуально.
Алуан Хаддад

3
@fijiaaron: Як нестандартне обстеження як? Хіба це не ціла функція, незалежно від того, який блок-ви оголосили-це-в чомусь дивним?
SamB

78

Я думаю, що це відповідає математичній традиції. У математиці часто говорять «нехай x довільне дійсне число» або подібне.


Я вважаю за краще, щоб ця відповідь була більшою мірою, оскільки вона коротка і досить відносна, оскільки ми всі проходили алгебру, то, ймовірно, слід слідувати поясненням, як те, що вказують інші.
duduwe

69

Додаючи до відповіді програми exebook , використання ключового слова в математиці дозволяє також добре інкапсулювати letмасштабні наслідки, коли вони використовуються в Javascript / ES6. Зокрема, так само, як наступний код ES6 не знає призначення в дужках, toPrint коли він виводить значення 'Hello World',

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

нехай, як використовується у формалізованій математиці (особливо при написанні доказів), вказує, що поточний екземпляр змінної існує лише для сфери цієї логічної ідеї. У наступному прикладі x відразу ж отримує нову ідентичність після введення нової ідеї (зазвичай це поняття, необхідні для доказу основної ідеї) і повертається негайно до старого x після завершення поданого доказу. Звичайно, так само, як і в кодуванні, це вважається дещо заплутаним, тому зазвичай уникають, обираючи іншу назву для іншої змінної.

Нехай х так і так ...

  Доказовий матеріал

 Нова ідея {Нехай x буде щось інше ... доведіть щось} Висновок Нова ідея

 Доведіть основну думку зі старим x


19
Я думаю, що це дійсно корисно. Прийнята відповідь майже трохи вводить в оману, оскільки говорить про те, що значення неможливо змінити, а це зовсім не те let, про що йдеться. letвсе стосується сфери застосування.
jinglesthula

Просто думка: letзмушує мене думати про щось подібне, що відбувається в свідомості письменника коду: "Добре, щойно цей момент let foo = bar, але тоді він може повернутися до свого початкового значення або перестати бути. Це чітко проілюстровано в приклади для блоку Scope і повторного оголошення змінних в цьому W3Schools уявлення про let. Знову ж , не роблячи вигляд , щоб принести в науковому відповіді якого - то, але цей обмін більше як мнемонічні пам'ятати , коли я хочу використовувати let.
Ален

Я думаю, що тут варто бути дещо точнішими, задля концептуальної ясності. Ваш приклад код ES6 не "ігнорує призначення в дужках". Він виконує призначення за вказівкою на новій змінній, toPrintяка існує лише в блоці , а потім прискіпливо викидає цю змінну, коли блок закінчується. А після виходу ми знову знаходимось у зовнішньому просторі, де внутрішнього toPrintвже немає, тому console.log(toPrint)відноситься до зовнішнього toPrint . Справа не в тому, що що-небудь ігнорується, це просто те, що letзмінні мають обмежений термін життя, визначений їх областю.
FeRD

1
@FeRD, відмінний момент. Я вніс редагування вище, щоб видалити вживання слова "ігнорує", оскільки це обтяжує суть.
Еван Білий

36

Він робить саме те, що varробить із різницею сфери. Тепер він не може прийняти ім'я, varоскільки це вже прийнято.

Так виглядає, що він прийняв наступне найкраще ім’я, яке має семантичний характер у цікавій англійській мовній конструкції.

let myPet = 'dog';

Англійською мовою написано "Нехай мій вихованець буде собакою"


5
Незважаючи на те, що походження нехай може бути лінгвістичним та математичним, наближення до домашнього посилання, безсумнівно, є твердженням LET у всіх версіях мови програмування BASIC, що багато хто з авторів ES6 почали б вивчати, якби вони закінчилися 40 років.
wide_eyed_pupil

5
@wide_eyed_pupil Просто FYI: як старший за 40 (хоча і не автор ES6), який виріс на BASIC, жодна із спільнот, з якими я брав участь, не використовувала LET у загальній практиці; ми просто присвоїли змінні, як це робить зараз Python (наприклад A$="HELLO WORLD"). Серед залучених інтерпретаторів були Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 на CP / M, Applesoft BASIC і навіть BASCOM, компілятор MS BASIC на CP / M. VAX BASIC мав LET, але, як я пам’ятаю, цього не вимагав. Пам'ять тоді була тісною, і 3 або 4 зайвих символу тексту програми за заявою змінили особливість, особливо у "великих" програмах.
Пітер Халл

@PeterHull Цікаво, що я вперше кодував картки, позначені олівцем, прикріплені до цифрового процесора, потім мейнфрейми в дослідницькій лабораторії старого та Digital PDP8 у школі. ніколи не бачив, щоб люди використовували LET, не використовуючи заяву, не в книгах, яких я також читав. Зауважте, що мене запропонували ввести FORTRAN і PASCAL, як тільки я отримав будь-яке хороше, основне - це так само погано, як навіть не мав GOSUB (тобто функції багаторазового використання) у використаних нами версіях.
wide_eyed_pupil

Ви не можете перевизначити змінну let.
CONvid19

10

Найімовірніша можливість полягає в тому, що це був самий ідіоматичний вибір. Не тільки легко говорити, але й досить інтуїтивно зрозуміти. Дехто міг би сперечатися, тим більше, ніж var.

Але я вважаю, що тут є трохи більше історії.

З Вікіпедії :

Мова LCF Дани Скотта була етапом еволюції обчислення лямбда в сучасні функціональні мови. Ця мова запровадила вираз let, який з'явився в більшості функціональних мов з того часу.

Загальнодержавні імперативні мови, такі як ALGOL і Pascal, по суті, реалізують дозвільний вираз, реалізують обмежений спектр функцій у блокових структурах.

Я хотів би повірити, що це також було натхненням для letJavascript.


Ця відповідь стосується обчислення лямбда "нехай висловлюється", можливо, це не те, що просив ОП. І, здається, це пізніше, ніж LETу BASIC, з 1964 року.
Джозеф Квінсі

Ця вся стаття є однією з кількох написаних в основному власноруч користувачем Вікіпедії Thepigdog ще в 2014 році. Я буду розсудливим і просто скажу, що всі вони написані з дуже вузької точки зору, тому цитата (абсолютно невизначена) повинна бути викладена інтерпретували так, що документ Скотта "вніс" вираз пускання в обчислення лямбда , так само, як ES6 представив letJavaScript. Не зовсім неправдиво, наскільки це йде, але без реального значення. (І жодним чином не виключає можливості того, що Скотт використовував "нехай", також був натхненний BASIC LET.)
FeRD,

1

Нехай використовує більш безпосередній обмежений рівень на рівні блоку, тоді як var - це сфера функцій або загальна область застосування.

Здається, було вибрано найімовірніше, оскільки воно існує в багатьох інших мовах для визначення змінних, таких як BASIC та багатьох інших.


1

Я думаю, заборгованість JavaScript перед Схемою тут очевидна. Схема не тільки дозволила, але і дозволила *, нехай * -значить, синтаксис і нехай-значення. (Див., Мова програмування схеми, 4-е видання).

(Вибір додає додаткової довіри до того, що JavaScript є Lispy, але - перш ніж ми захопимось - не гомоніконічні.))))


1

Це також може означати що - щось на зразок «лексичного типу або Зв'язали навколишнього середовища» .. Це турбує мене , що було б просто «нехай це буде що ». І нехай запис не має сенсу в обчисленні лямбда.


Я шукав відповідь на кшталт цієї, я теж сумніваюся, що вона має загальне англійське значення "хай"
Meenohara
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.