JEP 203: Nashorn: Lexically-Scoped Variable & Constant Declarations
Nashorn: объявления переменных и констант с лексической областью видимости
| Ответственный | Hannes Wallnoefer |
| Тип | Feature |
| Область | JDK |
| Статус | Closed / Delivered |
| Выпуск | 8u40 |
| Компонент | core-libs / jdk.nashorn |
| Обсуждение | nashorn dash dev at openjdk dot java dot net |
| Трудоёмкость | M |
| Длительность | S |
| Рецензенты | Brian Goetz, Jim Laskey |
| Одобрен | Brian Goetz |
| Создан | 2014/06/05 14:41 |
| Обновлён | 2017/05/17 00:44 |
| Задача | 8046038 |
Аннотация
Реализовать объявления переменных (let) и констант (const) с лексической областью видимости из готовящейся спецификации ECMAScript 6.
Цели
-
Обеспечить поддержку ключевых слов
letиconst. -
Реализовать лексическую область видимости для переменных и констант, объявленных через
letиconst, а также для объявлений функций, как того требует ECMAScript 6. -
Сделать эти возможности совместимыми с другими движками JavaScript.
Что не является целью
Этот JEP ограничен перечисленными выше возможностями; другие новые возможности ECMAScript 6 в него не входят.
Мотивация
Готовящаяся версия 6 стандарта ECMAScript под кодовым названием «Harmony» станет первой, в которой поддерживается блочная область видимости для объявлений переменных, констант и функций. Предыдущие версии ECMAScript (включая версию 5, реализованную в Nashorn) предоставляют для объявления переменных только ключевое слово var, при котором областью видимости всегда служит тело объемлющей функции или программа, и не позволяют объявлять константы. В ECMAScript 6 появляются два новых ключевых слова, let и const, для определения переменных и констант только в пределах их лексической области видимости.
Отсутствие лексических областей видимости широко признаётся одним из главных недостатков нынешнего JavaScript. Поэтому поддержка let и const и лексических областей видимости стоит очень высоко в списке возможностей ECMAScript 6, реализованных в других движках JavaScript.
Эта возможность уже реализована в движках JavaScript V8 и Mozilla Spidermonkey и используется некоторыми модулями Node.js. Поэтому её запрашивала, среди прочих, команда Avatar.js.
Описание
Вплоть до версии 5 стандарта ECMAScript в JavaScript для объявления переменных есть только ключевое слово var. Одна из главных проблем var в том, что областью видимости переменных всегда является всё тело объемлющей функции. Например, в следующем коде переменная a определена во всей функции:
function f(x){
if (x) {
var a = 42;
}
// "a" is defined here
}
Это может создать серьёзные проблемы, если часть кода должна обращаться к переменной с тем же именем, определённой вне функции:
var a = 2;
function f(x) {
// "a" is undefined here
if (x) {
var a = 42;
}
// "a" is 42 or undefined, depending on "x"
}
Ключевое слово let, появившееся в ECMAScript 6, позволяет ограничить объявление a объемлющим блоком:
let a = 2;
function f(x) {
// "a" is 2 here
if (x) {
let a = 42;
}
// "a" is still 2
}
Вторая проблема var — невозможность определять константы, если не считать очень громоздкого метода Object.defineProperty:
// Only way to define a constant in ECMAScript 5
Object.defineProperty(this, "CONSTANT", { writable: false, configurable: false, value 42 });
ECMAScript 6 существенно улучшает ситуацию, вводя ключевое слово const:
const CONSTANT = 42;
Как и в случае let, константы, объявленные через const, ограничены объемлющей лексической областью видимости.
Тестирование
Пока официальный набор тестов ECMAScript, test262, не охватывает ECMAScript версии 6. Нам придётся написать собственные тесты и посмотреть, что есть в сети.
Риски и допущения
ECMAScript 6 («Harmony») ещё не утверждён окончательно, поэтому до выхода финальной версии стандарта возможны изменения. Однако текущий черновик практически заморожен, и ожидается, что оставшиеся изменения будут небольшими или будут касаться граничных случаев.