{Вы не знаете JS} Замыкания и объекты
Каким бы опытом программирования на JavaScript вы ни обладали, скорее всего, вы не понимаете язык в полной мере. Это лаконичное, но при этом глубоко продуманное руководство познакомит вас с областями видимости, замыканиями, ключевым словом this и объектами – концепциями, которые необходимо знать для более эффективного и производительного программирования на JS. Вы узнаете, как и почему они работают, и как замыкания могут стать эффективной частью вашего инструментария разработки.
Как и в других книгах серии «Вы не знаете JS», здесь рассматриваются нетривиальные аспекты языка, от которых программисты JavaScript предпочитают держаться подальше. Вооружившись этими знаниями, вы достигнете истинного мастерства JavaScript.
В книге рассматриваются следующие темы:
- Наборы правил, которые используются движком JavaScript для поиска переменных в коде.
- Вложенные области видимости – наборы контейнеров для переменных и функций.
- Области видимости на базе функций и блоков, поднятие, а также паттерны и преимущества сокрытия на базе областей видимости.
- Использование замыканий для решения синхронных и асинхронных задач, включая создание библиотек JavaScript.
- Почему привязка this указывает на объекты в зависимости от того, как вызывается функция.
- Природа объектов JS — почему нужно ссылаться на них.
- Использование паттерна mixin для классов.
- Переход от проектирования класса/наследования к делегированию поведения.
- Как стиль OLOO (объекты, связанные с другими объектами) естественным образом реализует делегирование поведения.
Об авторе:
Кайл Симпсон - евангелист Open Web и энтузиаст JavaScript. Он пишет книги, читает лекции, выступает на семинарах, конференциях и является лидером OSS.
Введение. 11
Задача. 12
Благодарности. 14
О книге. 22
Типографские соглашения. 23
Использование программного кода примеров. 24
От издательства. 24
ЧАСТЬ 1. ОБЛАСТЬ ВИДИМОСТИ И ЗАМЫКАНИЯ...... 25
Предисловие. 26
Глава 1. Что такое область видимости?. 28
Немного теории компиляторов. 29
Разбираемся в областях видимости. 31
Участники. 31
Туда и обратно. 32
Немного терминологии. 33
Общение Движка с Областью видимости. 36
Упражнение. 37
Вложенная область видимости. 38
Метафоры. 39
Ошибки. 41
Итоги. 42
Ответ на упражнение. 43
Глава 2. Лексическая область видимости. 44
Стадия лексического анализа. 45
Поиск. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
Искажение лексической области видимости. 48
eval. 49
with . 52
Быстродействие. 55
Итоги. 56
Глава 3. Функциональные и блочные
области видимости. 57
Области видимости из функций. 57
Как скрыться у всех на виду. 59
Предотвращение конфликтов. 61
Функции как области видимости. 64
Анонимные и именованные функциональные выражения. 66
Немедленный вызов функциональных выражений . 67
Блоки как области видимости. 70
with . 72
try/catch. 73
let. 74
const. 80
Итоги. 80
Глава 4. Поднятие. 82
Курица или яйцо? . 82
Компилятор наносит ответный удар. 84
Сначала функции. 87
Итоги. 89
Глава 5. Замыкание области видимости. 90
Просветление . 91
Технические подробности . 92
Теперь я вижу. 96
Циклы и замыкания. 99
Снова о блочной области видимости . 102
Модули . 103
Современные модули . 109
Будущие модули. 111
Итоги. 113
Приложение А. Динамическая область видимости . 115
Приложение Б. Полифилы для блочной
области видимости. 118
Traceur. 120
Неявные и явные блоки. 120
Быстродействие. 123
Приложение В. Лексическое this . 124
ЧАСТЬ 2. THIS И ПРОТОТИПЫ ОБЪЕКТОВ..............129
Предисловие. 130
Глава 6. Что такое this?. 133
Для чего нужно this? . 133
Путаница. 135
Сама функция. 136
Область видимости. 141
Что такое this?. 143
Итоги. 144
Глава 7. this обретает смысл!. 145
Место вызова. 145
Ничего кроме правил. 147
Связывание по умолчанию . 147
Неявное связывание. 149
Явное связывание. 154
Связывание new. 158
Все по порядку . 161
Определение this . 166
Исключения связывания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
Игнорирование this. 167
Косвенные ссылки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170
Мягкое связывание. 171
Лексическое поведение this. 173
Итоги. 176
Глава 8. Объекты . 177
Синтаксис . 177
Тип. 178
Встроенные объекты. 179
Содержимое. 182
Вычисление имен свойств. 184
Свойства и методы. 185
Массивы. 188
Дублирование объектов . 189
Дескрипторы свойств . 192
Неизменяемость. 197
[[Get]] . 200
[[Put]]. 202
Геттеры и сеттеры . 203
Существование. 206
Перебор. 209
Итоги. 215
Глава 9. Классы. 217
Теория классов . 218
Паттерн проектирования «класс». 220
«Классы» JavaScript . 221
Механика классов . 222
Строительство . 222
Конструктор. 224
Наследование . 225
Полиморфизм. 228
Множественное наследование. 231
Примеси . 232
Явные примеси. 233
Неявные примеси. 241
Итоги. 242
Глава 10. Прототипы . 244
[[Prototype]]. 244
Object.prototype . 247
Назначение и замещение свойств. 247
«Класс». 251
Функции «классов». 251
«Конструкторы». 256
Механика. 259
Наследование (на основе прототипов). 263
Анализ связей «классов» . 268
Связи между объектами. 273
Создание связей вызовом Create(). 273
Связи как резерв?. 277
Итоги. 279
Глава 11. Делегирование поведения. 281
Проектирование, ориентированное на делегирование . 282
Теория классов. 283
Теория делегирования . 285
Сравнение моделей мышления. 292
Классы и объекты . 298
«Классы» виджетов . 298
Делегирование для объектов Widget. 302
Упрощение архитектуры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305
Расставание с классами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .309
Более приятный синтаксис. 312
Нелексичность . 314
Интроспекция . 316
Итоги. 321
Приложение Г. Классы ES6. 322
class. 323
Проблемы class . 325
Статический > динамический?. 331
Итоги. 332
Об авторе. 333