Повторные идентификаторы в одной декларации Var в JavaScript - PullRequest
1 голос
/ 25 февраля 2020

Я заметил, что Google Closer Compiler может упаковать операторы с переменными в предыдущее объявление var, производя повторяющиеся идентификаторы в этом объявлении. Это пример вывода, который я получил:

    var a = Ak - Aj, 
        b = Bk - Bj, 
        c = Math.sqrt(a*a+b*b), 
        a = a / c,
        b = b / c

Обратите внимание, как a и b повторно объявлены и им присвоены новые значения в пределах той же самой декларации var. Кроме того, похоже, что старые значения a и b используются при их второй инициализации. Создает ли это хорошо определенное поведение в ES5 / ES6 ?

1 Ответ

2 голосов
/ 26 февраля 2020

Спецификация EcmaScript содержит это в разделе в var:

В операторе var объявляются переменные, которые находятся в области действия VariableEnvironment контекста выполнения. Переменные var создаются, когда создается экземпляр их содержащей Lexical Environment, и при создании они инициализируются как undefined . В рамках любого VariableEnvironment общий BindingIdentifier может появляться в более чем одном VariableDeclaration , но эти объявления совместно определяют только одну переменную. Переменной, определенной VariableDeclaration с Инициализатором , присваивается значение ее Инициализатора * AssignmentExpression , когда VariableDeclaration выполняется, а не при создании переменной.

Другими словами, переменная может встречаться более одного раза в операторе var, но соответствующая переменная будет объявлена ​​только один раз, и это объявление произойдет до того, как будет выполнен какой-либо код (в этой области) (он же «подъем»). Инициализация будет выполняться в обычном порядке выполнения.

Итак, по спецификации ваш пример кода эквивалентен:

var a, b, c;
a = Ak - Aj;
b = Bk - Bj; 
c = Math.sqrt(a*a+b*b); 
a = a / c;
b = b / c;
...