Почему область блока не была первоначально реализована в 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, которые были локальны только для одного цикла.