Синтаксис оператора with
WithStatement [Yield, Await, Return] :
with ( Expression [+In, ?Yield, ?Await] ) Statement [?Yield, ?Await, ?Return]
Оператор with добавляет объект Environment Record для вычисляемого объекта в лексическую среду текущего контекста выполнения. Затем он выполняет инструкцию, используя эту расширенную лексическую среду. Наконец, восстанавливается исходная лексическая среда.
14.11.1 Статическая семантика: Ранние Ошибки
WithStatement : with ( Expression ) Statement
- Это синтаксическая ошибка, если код, соответствующий этому производству, содержится в коде строгого режима.
- Это синтаксическая ошибка, если IsLabelledFunction(Statement) является true (истинно).
Второе правило необходимо применять только в том случае, если реализовано расширение, указанное в разделе B.3.1.
14.11.2 Семантика времени выполнения: Оценка
WithStatement : with ( Expression ) Statement
1. Пусть val будет результатом вычисления выражения Expression. 2. Пусть obj будет ? ToObject(? GetValue(val)). 3. Пусть oldEnv будет LexicalEnvironment текущего контекста выполнения. 4. Пусть newEnv будет NewObjectEnvironment(obj, true, oldEnv). 5. Установите для LexicalEnvironment текущего контекста выполнения значение newEnv. 6. Пусть C будет результатом оценки Statement. 7. Установите LexicalEnvironment текущего контекста выполнения на oldEnv. 8. Вернуть Завершение(UpdateEmpty (C, undefined)).
Независимо от того, как управление покидает внедренный оператор Statement, обычно или в результате какой-либо формы внезапного завершения или исключения, LexicalEnvironment всегда возвращается в свое прежнее состояние.
Информационные ссылки
Стандарт ECMAScript — Раздел «14.11 The with Statement» — https://tc39.es/ecma262/#sec-with-statement