openjdk.ruOpenJDK на русском

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») ещё не утверждён окончательно, поэтому до выхода финальной версии стандарта возможны изменения. Однако текущий черновик практически заморожен, и ожидается, что оставшиеся изменения будут небольшими или будут касаться граничных случаев.