Scope

Get Started. It's Free
or sign up with your email address
Scope by Mind Map: Scope

1. Обработка кода

1.1. Compiler

1.1.1. Что делает компилятор?

1.1.1.1. 1. Tokenizing/Lexing - создание токенов

1.1.1.2. 2. Parsing - токены в AST

1.1.1.3. 3. Code-Generation - AST в исполняемый код

1.2. Scope

1.3. Engine

1.3.1. Операция присваивания

1.3.1.1. RHS (Right-hand side)

1.3.1.1.1. Ошибка ReferenceError, если нет переменной

1.3.1.1.2. Ошибка TypeError, если пытаешься сделать что-то недопустимое с переменной

1.3.1.2. LHS (Left-hand Side)

1.3.1.2.1. В Strict mode -- Ошибка ReferenceError

1.3.1.2.2. Без Strict mode -- создание переменной в Global Scope

2. Виды скоупов

2.1. Лексический скоуп (write-time)

2.2. Динамический скоуп (runtime)

3. Особенности

3.1. Cкоуп заканчивает поиск, когда найдено первое совпадение

3.2. Лексический скоуп определяется только тем, где функция была задекларирована

3.3. Лексический скоуп можно изменить, но это ведёт к плохой производительности - не применяются оптимизации

3.3.1. eval(...) setTimeout(...) setInterval(...) new Function(...)

3.3.1.1. может модифицировать существующий лексический скоуп, если в исполняемом коде есть одна и более деклараций

3.3.2. with

3.3.2.1. создаёт полностью новый скоуп

3.4. Переменные, определённые в функции могут быть использованы только внутри функции (видны вглубину)

3.5. Механизм всплытия

3.5.1. Декларация переменных происходит до присваивания им значений

3.5.2. Functions first

3.6. Сокрытие скоупов - Principle of Least Privilege / Least Authority / Least Exposure

3.7. Механизм замыканий - функция может запомнить и получить доступ к лексическому скоупу, даже когда она вызвана из вне своего лексического скоупа

3.7.1. Замыкания в циклах

3.7.2. Блочный скоуп

3.7.3. Модули

4. Где?

4.1. Namespaces

4.2. Функции, как скоуп

4.3. Блоки, как скоуп

4.3.1. with

4.3.2. try/catch

4.3.3. let

4.3.4. const

4.4. IIFE