Почему область блока изначально не была реализована в JavaScript?


Я прочитал и обнаружил на собственном опыте, что JavaScript не имеет области блока. Предполагая, что язык был разработан таким образом по причине, что это за причина?

Я посмотрел вокруг на Google и здесь, но сообщения, которые я нашел, просто повторяют, что JS имеет область действия, а не область блокировки, не объясняя почему. Мне любопытно знать, почему это на самом деле так.

4 51

4 ответа:

преобразование моего комментария в ответ

выбор создателя: я написал в Твиттере Брендан и получил ответ:

@mplungjan 10 дней не оставляли времени на область блока. Кроме того, многие "скриптовые языки" той эпохи середины 90-х годов имели несколько областей применения и росли позже.


тем не менее, вот некоторые важные моменты:

важно: JavaScript не имеет области блока. Переменные, введенные в блок, относятся к содержащей их функции или скрипту, и эффекты их установки сохраняются за пределами самого блока. Другими словами, операторы block не вводят область. Хотя "автономные" блоки являются допустимым синтаксисом, вы не хотите использовать автономные блоки в JavaScript, потому что они не делают то, что вы думаете, если вы думаете, что они делают что-то подобное таким блокам в C или Java.

мы можем искусственно представить области, создавая новые функции и немедленно вызывая их

let объявлены переменные не поднятый к началу заключая блока. Следовательно, ссылаясь на let объявленная переменная перед присвоением ей значения для того чтобы поднять ReferenceError.

повторное объявление той же переменной в той же области блока вызывает синтаксическую ошибку.

новый ответ по состоянию на 2015 год. ES6 имеет область блока для определения переменных с помощью let ключевое слово.

область действия блока не была реализована по следующим причинам:

  1. это делает язык проще в реализации. В JavaScript изначально был разработан как язык для написания интерактивных веб-приложений. Поэтому он должен быть небольшим и простым в реализации.
  2. области блока представляют собой хит производительности для динамических языков, таких как JavaScript. Это связано с тем, что при попытке доступа к некоторой переменной, которая не находится в текущей области JavaScript сначала проверяет текущую область, затем родительская область и так далее, пока она не найдет переменную или не достигнет конца. Следовательно, введение областей блоков сделало бы переменный доступ в циклах и вложенных циклах очень медленным.
  3. отсутствие областей блока облегчает написание программ. Например, вы хотите создать переменную только в том случае, если выполняется определенное условие. Все, что вам нужно сделать в JavaScript-это объявить и определить переменную в if заявление. В таких языках, как C, вам придется объявите переменную вне if заявление и определить его в if заявление.
  4. отсутствие областей блока позволяет поднимать объявления. Это особенно полезно в случае объявления функций. Например, смотрите эту скрипку:http://jsfiddle.net/L6SgM/ (обратите внимание, однако, что этот пример не работает в Firefox).
  5. поскольку JavaScript поддерживает выражения функций первого класса, нам не нужны области блоков. Они могут быть смоделированы с помощью сразу же вызывается функция выражения.

есть много причин, но некоторые из них приходят на ум, чтобы помочь в разборе/отладке кода, который использует объектные литералы (которые иногда могут выглядеть как блок), и упростить сборку мусора локальных переменных.

надеюсь, что обещанная поддержка (обсуждается здесь, например,http://esdiscuss.org/notes/2012-07-25) оказывается реальным, потому что было бы очень удобно использовать переменные, такие как i которые были локальными только для одного цикла.