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

306

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

Виталий Зданевич
источник
7
Бейсик , изобретенный в 1962 году, используется LET. Там могут быть более ранние примеры языка.
Дэвид Р. Триббл
5
Бейсик был изобретен в 1964 году , а не в 1962 году. См. Также здесь . Использование LETописано на стр. 7 первого проекта руководства от мая 1964 г., pdf здесь .
Джозеф Куинси,
Более конкретно const, это постоянная или неизменяемая (доступная только для чтения) ссылка на объект, где сам объект все еще является изменяемым. Например. После объявления / правопреемника const foo = ['bar'], по- foo.push('bat')прежнему будет законным, но foo = ['bar', 'bat']это не так . Но это слишком много печатать.
user982671

Ответы:

372

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

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

exebook
источник
94
И официальная страница документации Mozilla цитирует эту страницу по этому вопросу developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Сарат Чандра
9
Это также хорошо, что len('var') === len('let')означает, что ваши объявления хорошо вписываются в ваш редактор в любом случае. Я еще не нашел ничего, чтобы предположить, что это было преднамеренно, но это может быть либо a) визуально приятным и более читабельным, либо b) ужасно раздражающим, чтобы отлаживать, если вы смешиваете два (что в любом случае кажется плохой идеей, но я ' Я видел это сделано).
бричины
13
Другими словами, letтрадиционно использовался для описания константы, так как в let C = the speed of lightJavascript решили использовать let для описания переменной с нестандартной областью видимости и в то же время ввести другое ключевое слово для констант.
fijiaaron
1
Я не согласен, что letблизко к var. Также Scala не использует, letпоэтому я не вижу, насколько это актуально.
Алуан Хаддад
3
@fijiaaron: Нестандартный обзор, как? Разве целая функция, независимо от того, какой блок вы объявили, в какой-то степени странна для начала?
SamB
78

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

Тигран Салуев
источник
Я предпочитаю этот ответ больше, так как он краткий и достаточно релевантный, так как мы все проходили алгебру, тогда, вероятно, должно последовать объяснение, подобное тому, что указывают другие.
duduwe
69

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

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

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

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

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

 Новая идея {Пусть 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 может быть лингвистическим и математическим, ссылка на дом, несомненно, является утверждением LET во всех версиях языка программирования BASIC, который многие из авторов ES6 начали бы изучать, если бы они закончили 40 лет
wide_eyed_pupil
5
@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 дополнительных символа текста программы на оператор имели значение, особенно в «больших» программах.
Питер Халл
@PeterHull Интересно, я сделал свое первое кодирование на картах с пометкой карандашом, прикрепленных к цифровому ЦП, затем к мэйнфреймам в исследовательской лаборатории старика и цифровому PDP8 в школе. ни разу не видел, чтобы люди использовали LET, фактически не используя утверждение, ни в книгах, которые я читал. Имейте в виду, что мне было рекомендовано кодировать на FORTRAN и PASCAL, как только я получил что-то хорошее, базовое состояние было таким же плохим, как и то, что у меня даже не было GOSUB (т.е. многоразовых функций) в версиях, которые я использовал.
wide_eyed_pupil
Вы не можете переопределить переменную let.
CONvid19
10

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

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

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

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

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

Я хотел бы верить, что это тоже послужило вдохновением для letJavascript.

oxalorg
источник
Этот ответ относится к лямбда-исчислению «позвольте выражению», которое, возможно, не является тем, о чем спрашивал ОП. И, похоже, это будет позже, чем LETв BASIC, с 1964 года.
Джозеф Куинси,
Вся эта статья является одной из нескольких, написанных в основном в одиночку пользователем Википедии Thepigdog в 2014 году. Я буду рассудительным и просто скажу, что все они написаны с очень узкой точки зрения, поэтому приведенное (совершенно не ссылочное) утверждение должно быть интерпретируется как высказывание, что статья Скотта «ввела» выражение let в лямбда-исчисление так же, как ES6 представил letв JavaScript. Не совсем не соответствует действительности, но без какого-либо реального значения. (И ни в коем случае исключает возможность того, что использование Скотта «пусть» была также вдохновлена BASIC LET.)
FERD
1

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

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

О.Г. Шон
источник
1

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

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

Эрик Х.
источник
1

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

Себастьян Паке
источник
Я искал ответ, подобный этому, я тоже сомневаюсь, что он имеет общее английское значение «let»
Минохара