Почему для объявлений переменных с блочной областью видимости в JavaScript было выбрано имя let?

Я понимаю, почему var принимает это имя - это переменная, const - это константа, но что означает имя для let, которое относится к текущему блоку? Будь как будет?


person Vitaly Zdanevich    schedule 20.06.2016    source источник
comment
BASIC, изобретенный в 1962 году, использовал LET. Могут быть более ранние языковые примеры.   -  person David R Tribble    schedule 02.08.2017
comment
BASIC был изобретен в 1964, не 1962. См. также здесь. Использование LET описано на странице 7 первого проекта руководства от мая 1964 года, pdf здесь.   -  person Joseph Quinsey    schedule 27.03.2018
comment
В частности, const - это постоянная или неизменяемая (только для чтения) ссылка на объект, где сам объект по-прежнему является изменяемым. Например. После объявления / назначения const foo = ['bar'], foo.push('bat') все еще будет законным, а foo = ['bar', 'bat'] - нет. Но это слишком много для набора текста.   -  person user982671    schedule 25.05.2018
comment
Разве это не просто английский глагол let (например, let it be so)? Почему это может быть поставлено под вопрос?   -  person 2540625    schedule 26.07.2020
comment
Ура, еще одна функция, о которой никто не просил и не нуждался. То же самое и с IIFE. Javascript сделал именно то, что ему нужно было более 15 лет назад, теперь они просто конкурируют с последними и лучшими ключевыми словами и создают без чертовой причины. Личные фавориты включают конструкцию класса в предположительно прототипированной объектной модели. Строгий набор и дополнительные типы со дня на день, а?   -  person Christoffer Bubach    schedule 09.12.2020


Ответы (8)


Let - это математическое выражение, которое было принято в ранних языках программирования, таких как Scheme и Basic. Переменные считаются низкоуровневыми сущностями, не подходящими для более высоких уровней абстракции, поэтому многие разработчики языков стремятся ввести аналогичные, но более мощные концепции, такие как Clojure, F #, Scala, где let может означать значение или переменную , которая может быть назначен, но не изменен, что, в свою очередь, позволяет компилятору улавливать больше ошибок программирования и лучше оптимизировать код.

В JavaScript было var с самого начала, поэтому им просто нужно было другое ключевое слово, и они просто заимствованы из десятков других языков, которые уже используют let в качестве традиционного ключевого слова как можно ближе к var, хотя в JavaScript let вместо этого создает локальную переменную области блока.

person exebook    schedule 20.06.2016
comment
Официальная страница документации Mozilla ссылается на эту страницу для разработчиков этого вопроса. mozilla.org/en/docs/Web/JavaScript/Reference/ - person Sarath Chandra; 21.08.2017
comment
Также приятно, что len('var') === len('let'), что означает, что ваши объявления в любом случае хорошо выстраиваются в вашем редакторе. Я еще не нашел ничего, чтобы предположить, что это было преднамеренно, но это может быть либо а) визуально приятным и более читаемым, или б) ужасно раздражающим для отладки, если вы смешиваете два (что в любом случае кажется плохой идеей, но я '' я видел это сделано). - person brichins; 25.10.2017
comment
Другими словами, let традиционно использовался для описания константы, как в let C = the speed of light, поэтому Javascript решил использовать let для описания переменной с нестандартной областью видимости и в то же время ввести другое ключевое слово для констант. - person fijiaaron; 09.03.2018
comment
Я не согласен с тем, что let близок к var. Также Scala не использует let, поэтому я не понимаю, насколько это актуально. - person Aluan Haddad; 11.04.2018
comment
@fijiaaron: Нестандартная область видимости как? Разве цельная функция независимо от того, какой блок вы ее объявили, не выглядит странным для начала? - person SamB; 05.06.2019
comment
@fijiaaron Ага, ты здесь ошибаешься. это тоже не очень хорошее применение let в науке, вы обычно не используете его для констант, потому что эти переменные все знают. c - скорость света. мы не должны этого допустить. мы говорим, пусть x будет расстоянием до центра, когда оно вообще не является константой. - person Nacht; 30.10.2019
comment
@Nacht: Нет, c, как и другие символы, может относиться практически ко всему. Если вы помните теорему Пифагора, c - это длина гипотенузы. Даже π используется для многих вещей, кроме значения, близкого к 3, например для перестановок или вероятностных распределений. И люди делают говорят: Пусть c будет скоростью света, или Пусть c будет длиной гипотенузы, просто чтобы убедиться, что автор и читатель находятся на одной странице, так сказать. Прочтите несколько статей по математике. Вы увидите, что let - это абсолютно стандартный способ привязать символ к значению. - person Matt; 11.07.2020
comment
@Matt хмм ... сейчас я понятия не имею, почему я так сильно возражал против fijiaaron ... может быть, я не очень внимательно его читал и думал, что он говорит, что let используется для констант в javascript? во всяком случае, я хорошо знаком с пусть x будет таким-то и таким-то, как я на самом деле упоминал в своем комментарии. Я возражал только против его использования для констант. Возможно, это все еще происходит, и мне действительно нужно читать больше статей по математике. - person Nacht; 12.07.2020
comment
@Nacht: Ах, fijiaaron интерпретировал ответ как высказывание о том, что существует традиция (из Clojure, F #, Scala), что let предназначен для констант. Эта предполагаемая традиция может создать впечатление, будто JavaScript делает что-то наоборот. Но, конечно, такой традиции нет, и на этот счет можно было бы дать более четкий ответ. Кроме того, последнее слово вместо этого представляло контраст с var, а не с традицией. Опять же, легко ошибиться, сказав, что область видимости на уровне блока нестандартна. Но конечно стандартно. С этими ошибками более понятна небольшая тирада fijiaaron против JavaScript. - person Matt; 12.07.2020
comment
Главный пункт первого абзаца, кажется, заключается в том, что константы - это более высокий уровень абстракции и более мощный, чем переменные. Это кажется весьма сомнительным. - person Matt; 12.07.2020
comment
Проголосование за комментарий @fijiaaron указывает на то, что многие люди понимают этот ответ, утверждая, что let традиционно используется для констант. Это не случай. Как программная конструкция LET впервые появилась в 1964 году в BASIC, в котором вообще не было неизменяемых. Это было за десять лет до Scheme. Причина, по которой let используется для неизменяемых в Scheme / Clojure / Scala, состоит только в том, что неизменяемые объекты настолько распространены в функциональных языках. Что касается F #, поскольку он является многопарадигмальным языком, он использует let для неизменяемых и изменяемых переменных. В математике let используется для любого типа определения переменной или свойства. - person Matt; 12.07.2020
comment
Пункт второго абзаца о том, что им просто нужно еще одно ключевое слово, а let является традиционным, точно соответствует цели. - person Matt; 12.07.2020
comment
На самом деле математика существует дольше, чем BASIC - person fijiaaron; 26.08.2020

Думаю, это следует математической традиции. В математике часто говорят «пусть x будет произвольным действительным числом» или тому подобное.

person Tigran Saluev    schedule 20.06.2016
comment
Я предпочитаю этот ответ, поскольку он краток и достаточно понятен, поскольку все мы прошли через алгебру, тогда, вероятно, за ним должно последовать объяснение, подобное тому, на что указывают другие. - person duduwe; 21.04.2020

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

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

let, используемое в формализованной математике (особенно при написании доказательств), указывает, что текущий экземпляр переменной существует только в рамках этой логической идеи. В следующем примере x сразу же приобретает новую идентичность при входе в новую идею (обычно это концепции, необходимые для доказательства основной идеи) и сразу же возвращается к старому x после завершения вспомогательного доказательства. Конечно, так же, как и в кодировании, это считается несколько запутанным, и поэтому обычно избегают, выбирая другое имя для другой переменной.

Пусть x будет таким-то ...

Доказательства

Новая идея {Пусть x будет чем-то еще ... докажите что-нибудь} Сделайте новую идею

Подтвердите основную идею с помощью старых x

person Evan White    schedule 03.04.2017
comment
Думаю, это действительно полезно. Принятый ответ почти немного вводит в заблуждение, поскольку в нем говорится о невозможности изменения значения, а это совсем не то, о чем let. let - это все о размахе. - person jinglesthula; 13.07.2017
comment
Просто одна мысль: let заставляет меня думать о чем-то подобном, происходящем в голове автора кода, хорошо, только в этот момент, let foo = bar, но затем он может вернуться к своему исходному значению или перестать быть. Это четко показано в примерах для области действия блока и повторного объявления переменных в этой презентации W3Schools из let. Опять же, я не претендую на какой-то научный ответ, но делюсь этим больше как мнемоническим приемом, чтобы запомнить, когда я хочу использовать let. - person Alain; 26.09.2019
comment
Думаю, здесь стоит немного уточнить, ради концептуальной ясности. Ваш пример кода ES6 не игнорирует назначение в фигурных скобках. Он выполняет присвоение в соответствии с инструкциями для новой переменной toPrint, которая существует только внутри блока, а затем покорно отбрасывает эту переменную, когда блок заканчивается. И после выхода мы снова во внешней области видимости, где внутренний toPrint больше не существует, поэтому console.log(toPrint) относится к внешнему toPrint. Дело не в том, что что-то игнорируется, просто у let переменных есть конечное время жизни, определяемое их областью действия. - person FeRD; 13.01.2020
comment
@FeRD, отличный момент. Я отредактировал приведенное выше, чтобы убрать использование слова игнорирует, поскольку оно запутывает суть. - person Evan White; 22.01.2020

Он делает то же самое, что и var, но с разницей в области видимости. Теперь он не может принимать имя var, поскольку оно уже занято.

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

let myPet = 'dog';

На английском написано: «Пусть моим питомцем будет собака».

person Charlie    schedule 20.06.2016
comment
Хотя возникновение let может быть лингвистическим и математическим, ссылка на близкий к дому, несомненно, является оператором LET во всех версиях языка программирования BASIC, который многие из авторов ES6 начали бы изучать, если бы они закончились. 40 лет. - person wide_eyed_pupil; 10.04.2017
comment
@wide_eyed_pupil К вашему сведению: поскольку я старше 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 дополнительных символа текста программы на оператор имели значение, особенно в больших программах. - person Peter Hull; 08.01.2018
comment
@PeterHull. Интересно, я впервые написал код на помеченных карандашом картах, подключенных к цифровому процессору, затем на мэйнфреймах в исследовательской лаборатории старика и на цифровом PDP8 в школе. ни разу не видел, чтобы люди использовали LET без фактического использования оператора, в том числе и в книгах, которые я читал. Имейте в виду, что меня побудили писать код на FORTRAN и PASCAL, как только я получил что-то хорошее, базовое, будучи таким же плохим, как и было, даже не имея GOSUB (то есть многоразовых функций) в версиях, которые я использовал. - person wide_eyed_pupil; 25.02.2018
comment
Вы не можете повторно объявить переменную let. - person Pedro Lobito; 03.03.2020

Скорее всего, это был самый идиоматический выбор. Не только легко говорить, но и интуитивно понятно. Некоторые могут поспорить, даже больше, чем var.

Но я считаю, что в этом есть немного больше истории.

Из Википедии:

Язык LCF Даны Скотт был этапом в эволюции лямбда-исчисления в современные функциональные языки. В этом языке появилось выражение let, которое с того времени появилось в большинстве функциональных языков.

Императивные языки с полным состоянием, такие как ALGOL и Pascal, по сути, реализуют выражение let для реализации ограниченного объема функций в блочных структурах.

Я хотел бы верить, что это тоже было источником вдохновения для let в Javascript.

person oxalorg    schedule 20.06.2016
comment
Этот ответ относится к лямбда-исчислению 'let выражение', что, возможно, не то, что спросил OP. И это, кажется, позже, чем LET в BASIC, с 1964 года. - person Joseph Quinsey; 27.03.2018
comment
Вся эта статья - одна из нескольких, написанных практически в одиночку пользователем Википедии Thepigdog еще в 2014 году. Я буду рассудителен и просто скажу, что все они написаны с очень узкой точки зрения, поэтому цитируемое (совершенно не имеющее ссылок) утверждение должно быть интерпретируется как утверждение, что статья Скотта ввела выражение let в лямбда-исчисление точно так же, как ES6 представил let в JavaScript. Не совсем так, насколько это возможно, но без какого-либо реального значения. (И это никоим образом не исключает возможности того, что использование Скоттом let было также вдохновлено BASIC LET.) - person FeRD; 24.03.2020

Это также может означать что-то вроде «Тип лексического окружения или связанный». Меня беспокоит, что это будет просто «пусть это будет тем». И пусть rec не имеет смысла в лямбда-исчислении.

person Sebastien Paquet    schedule 26.12.2019
comment
Я искал такой ответ, я тоже сомневаюсь, что он имеет общеанглийское значение let - person Meenohara; 16.06.2020

Let использует более непосредственную ограниченную область на уровне блока, тогда как var обычно является областью функции или глобальной областью.

Кажется, что let был выбран, скорее всего, потому что он используется во многих других языках для определения переменных, таких как BASIC и многих других.

person OG Sean    schedule 19.11.2017

Я думаю, что здесь очевидна заслуга JavaScript перед Scheme. В схеме есть не только let, но и let *, let * -значения, let-синтаксис и let-значения. (См. Язык программирования схем, 4-е изд.).

((Этот выбор добавляет доверия к представлению о том, что JavaScript - это Lispy, но - пока мы не увлеклись - не гомоиконичен.))))

person Eric H.    schedule 25.10.2018