Почему область блока не была первоначально реализована в JavaScript?
Я прочитал и обнаружил на собственном опыте, что JavaScript не имеет блочной области видимости. Предполагая, что язык был разработан таким образом по какой-то причине, вы можете объяснить мне, что это за причина?
Я посмотрел на Google и здесь, но посты, которые я нашел, просто повторяют, что у JS есть область действия функции, а не область блокировки, без объяснения причин. Мне любопытно узнать, почему это на самом деле так.
Ответы
Ответ 1
Преобразование моего комментария в ответ
Выбор создателя: я написал в Твиттере Брендан и получил следующий ответ:
@mplungjan 10 дней не оставляли времени для блока. Кроме того, многие "языки сценариев" той эпохи середины 90-х годов имели мало областей применения и выросли позже.
Тем не менее, вот некоторые важные моменты:
Важно: JavaScript до ECMAScript2015 (6-е издание) не имеет области видимости блока. Переменные, введенные в блоке, попадают в область действия содержащей их функции или сценария, и последствия их установки сохраняются за пределами самого блока. Другими словами, операторы блока не вводят область действия. Хотя "автономные" блоки являются допустимым синтаксисом, вы не хотите использовать автономные блоки в JavaScript, потому что они не делают то, что вы думаете, они делают, если вы думаете, что они делают что-то вроде таких блоков в C или Java.
мы можем искусственно вводить области видимости, создавая новые функции и немедленно вызывая их
объявленные переменные let
и const
поднимаются, но они не инициализируются undefined
же, как var
. Следовательно, ссылка на объявленную переменную let
или const
до того, как ей присвоено значение, вызывает ReferenceError.
Переопределение одной и той же переменной в той же области видимости блока вызывает ошибку SyntaxError.
Ответ 2
Новый ответ от 2015 года. ES6 имеет область действия для определений переменных с ключевыми словами let
и const
.
Ответ 3
Область блока не была реализована по следующим причинам:
- Это упрощает реализацию языка. Сначала JavaScript был разработан как язык для написания интерактивных веб-приложений. Следовательно, он должен быть небольшим и легким в реализации.
- Области блокировки отображают производительность для динамических языков, таких как JavaScript. Это связано с тем, что, когда вы пытаетесь получить доступ к некоторой переменной, которая не находится в текущей области, JavaScript сначала проверяет текущую область действия, затем родительскую область и так далее, пока она не найдет переменную или не достигнет конца. Следовательно, введение блочных областей сделает переменный доступ в циклах и вложенных циклах очень медленными.
- Отсутствие блоков позволяет легче писать программы. Например, вы хотите создать переменную только в том случае, если определенное условие истинно. Все, что вам нужно сделать в JavaScript, - объявить и определить переменную в инструкции
if
. В таких языках, как C, вы должны объявить переменную вне инструкции if
и определить ее в инструкции if
.
- Отсутствие блоков позволяет разрешать объявление. Это особенно полезно в случае объявлений функций. Например, посмотрите эту скрипту: http://jsfiddle.net/L6SgM/ (обратите внимание, что этот пример не работает в Firefox).
- Так как JavaScript поддерживает первоклассные выражения функций, нам не нужны блокировки. Они могут быть смоделированы с использованием сразу вызывается выражения функций.
Ответ 4
Есть много причин, но некоторые из них приходят на ум, чтобы помочь в анализе/отладке кода, который использует объектные литералы (которые иногда могут выглядеть как блок), и упростить сбор мусора локальных переменных.
Я надеюсь, что обещанная поддержка (обсуждаемая здесь, например, http://esdiscuss.org/notes/2012-07-25) оказалась реальной, потому что было бы очень удобно использовать переменные типа i
, которые были локальны только для одного цикла.