Отзывы о первом издании 13
От автора 14
Благодарности 16
Об этой книге 18
Кому адресована книга 18
Структура книги 18
Условные обозначения, принятые в книге 21
Загружаемый исходный код 21
Как связаться с авторами 21
Об авторах 22
Об иллюстрации на обложке книги 24
От издательства 25
Часть I. Разминка 27
Глава 1. JavaScript повсюду 29
1.1. Общее представление о языке JavaScript 30
1.1.1. Дальнейшее развитие JavaScript 32
1.1.2. Транспиляторы, обеспечивающие доступ к будущему JavaScript
сегодня 33
1.2. Общее представление о браузере 33
1.3. Нормы передовой практики 35
1.3.1. Отладка 36
1.3.2. Тестирование 36
1.3.3. Анализ производительности 37
1.4. Усиление переносимости приобретенных навыков 38
Резюме 39
Глава 2. Создание страницы в динамическом режиме 41
2.1. Общее представление о жизненном цикле веб-приложения 42
2.2. Стадия создания страницы 45
2.2.1. Синтаксический анализ кода HTML и построение модели DOM 46
2.2.2. Выполнение кода JavaScript 48
2.3. Обработка событий 52
2.3.1. Общее представление об обработке событий 53
Secrets_of_the_JavaScript_Ninja_Second_Edition.indb 6 ecrets_of_the_JavaScript_Ninja_Second_Edition.indb 6 04.09.2017 14:08:55 4.09.2017 14:08:55
Содержание 7
Резюме 59
Упражнения 59
Часть II. Представление о функциях 61
Глава 3. Функции высшего порядка для начинающих:
определения и аргументы 63
3.1. Главное отличие JavaScript как языка функционального
программирования 64
3.1.1. Функции в качестве объектов высшего порядка 65
3.1.2. Функции обратного вызова 66
3.2. Особенности применения функций в качестве объектов 70
3.2.1. Сохранение функций 71
3.2.2. Самозапоминающиеся функции 73
3.3. Определение функций 75
3.3.1. Объявления функций и функциональные выражения 77
3.3.2. Стрелочные функции 82
3.4. Аргументы и параметры функций 84
3.4.1. Оставшиеся параметры 86
3.4.2. Стандартные параметры 88
Резюме 91
Упражнения 92
Глава 4. Функции для ученика мастера: представление об их вызове 95
4.1. Использование неявных параметров функции 96
4.1.1. Параметр arguments 96
4.1.2. Параметр this, представляющий контекст функции 101
4.2. Вызов функций 102
4.2.1. Вызов как функции 103
4.2.2. Вызов как метода 104
4.2.3. Вызов как конструктора 107
4.2.4. Вызов через методы apply() и call() 113
4.3. Разрешение затруднений, связанных с контекстами функций 120
4.3.1. Обращение с контекстами функций с помощью стрелочных
функций 120
4.3.2. Применение метода bind() 124
Резюме 125
Упражнения 126
Глава 5. Функции для мастера: замыкания и области видимости 129
5.1. Общее представление о замыканиях 130
5.2. Применение замыканий на практике 134
5.2.1. Имитация закрытых переменных 134
5.2.2. Применение замыканий при обратных вызовах 136
Secrets_of_the_JavaScript_Ninja_Second_Edition.indb 7 ecrets_of_the_JavaScript_Ninja_Second_Edition.indb 7 04.09.2017 14:08:55 4.09.2017 14:08:55
8 Содержание
5.3. Отслеживание выполнения кода с помощью контекстов выполнения 139
5.4. Отслеживание идентификаторов с помощью лексических сред 142
5.4.1. Вложение кода 143
5.4.2. Вложение кода и лексические среды 144
5.5. Общее представление о типах переменных в JavaScript 147
5.5.1. Изменяемость переменных 147
5.5.2. Ключевые слова для определения переменных
и лексические среды 150
5.5.3. Регистрация идентификаторов в лексических средах 154
5.6. Исследование принципа действия замыканий 159
5.6.1. Еще раз об имитации закрытых переменных с помощью
замыканий 159
5.6.2. Разъяснение по поводу закрытых переменных 164
5.6.3. Еще раз о замыканиях и обратных вызовах 165
Резюме 167
Упражнения 168
Глава 6. Функции на перспективу: генераторы и обещания 171
6.1. Достижение изящности асинхронного кода с помощью
генераторов и обещаний 172
6.2. Использование функций-генераторов 174
6.2.1. Управление генератором с помощью итератора 176
6.2.2. Применение генераторов 179
6.2.3. Обмен данными с генератором 183
6.2.4. Исследование внутреннего механизма действия генераторов 186
6.3. Работа с обещаниями 193
6.3.1. Затруднения, связанные с простыми обратными вызовами 195
6.3.2. Углубленное исследование обещаний 197
6.3.3. Отклонение обещаний 200
6.3.4. Создание первого настоящего обещания 202
6.3.5. Связывание обещаний в цепочку 204
6.3.6. Ожидание ряда обещаний 205
6.4. Сочетание генераторов и обещаний 207
6.4.1. Асинхронные функции в перспективе 211
Резюме 212
Упражнения 213
Часть III. Исследование объектов и упрочение кода 215
Глава 7. Объектная ориентация с помощью прототипов 217
7.1. Общее представление о прототипах 218
7.2. Создание объектов и прототипы 221
7.2.1. Свойства экземпляров 224
7.2.2. Побочные эффекты динамического характера JavaScript 227
Secrets_of_the_JavaScript_Ninja_Second_Edition.indb 8 ecrets_of_the_JavaScript_Ninja_Second_Edition.indb 8 04.09.2017 14:08:55 4.09.2017 14:08:55
Содержание 9
7.2.3. Типизация объектов через конструкторы 230
7.3. Достижение наследования 232
7.3.1. Трудности переопределения свойства constructor 236
7.3.2. Операция instanceof 240
7.4. Применение “классов” в стандарте ES6 языка JavaScript 242
7.4.1. Применение ключевого слова class 243
7.4.2. Реализация наследования 246
Резюме 249
Упражнения 250
Глава 8. Управление доступом к объектам 253
8.1. Управление доступом к свойствам объектов с помощью методов
получения и установки 254
8.1.1. Определение методов получения и установки 256
8.1.2. Применение методов получения и установки для проверки
достоверности значений свойств 262
8.1.3. Применение методов получения и установки для определения
вычисляемых свойств 264
8.2. Применение прокси-объектов для управления доступом 266
8.2.1. Применение прокси-объектов для протоколирования 270
8.2.2. Применение прокси-объектов для измерения
производительности 272
8.2.3. Применение прокси-объектов для автоматического заполнения
свойств 274
8.2.4. Применение прокси-объектов для реализации отрицательных
индексов массивов 275
8.2.5. Проблемы с производительностью при использовании прокси-
объектов 278
Резюме 279
Упражнения 280
Глава 9. Работа с коллекциями 283
9.1. Массивы 284
9.1.1. Создание массивов 284
9.1.2. Добавление и удаление элементов с обоих концов массива 287
9.1.3. Добавление и удаление элементов в любом месте массива 289
9.1.4. Наиболее употребительные операции над массивами 291
9.1.5. Повторное использование встроенных методов обработки
массивов 303
9.2. Отображения 305
9.2.1. Объекты непригодны в качестве отображений 306
9.2.2. Создание первого отображения 309
9.2.3. Перебор элементов отображений 313
Secrets_of_the_JavaScript_Ninja_Second_Edition.indb 9 ecrets_of_the_JavaScript_Ninja_Second_Edition.indb 9 04.09.2017 14:08:55 4.09.2017 14:08:55
10 Содержание
9.3. Множества 314
9.3.1. Создание первого множества 315
9.3.2. Объединение множеств 317
9.3.3. Пересечение множеств 318
9.3.4. Разность множеств 319
Резюме 319
Упражнения 320
Глава 10. Овладение регулярными выражениями 323
10.1. Достоинства регулярных выражений 324
10.2. Основные сведения о регулярных выражениях 325
10.2.1. Назначение регулярных выражений 326
10.2.2. Члены и операции 328
10.3. Компиляция регулярных выражений 333
10.4. Фиксация совпадающих частей 336
10.4.1. Выполнение простых фиксаций 336
10.4.2. Проверка на совпадение с помощью глобальных регулярных
выражений 337
10.4.3. Ссылки на фиксации 339
10.4.4. Нефиксируемые группы 340
10.5. Замена текста с помощью функций 341
10.6. Решение типичных задач с помощью регулярных выражений 344
10.6.1. Учет символов перехода на новую строку 344
10.6.2. Сопоставление с символами Юникода 346
10.6.3. Сопоставление с экранированными символами 346
Резюме 347
Упражнения 348
Глава 11. Методики модуляризации кода 351
11.1. Модуляризация кода JavaScript до появления стандарта ES6 352
11.1.1. Определение модулей с помощью объектов, замыканий
и немедленно вызываемых функций 353
11.1.2. Модуляризация приложений на JavaScript по стандартам
AMD и CommonJS 360
11.2. Модули по стандарту ES6 364
11.2.1. Функциональные возможности экспорта и импорта 365
Резюме 371
Упражнения 372
Часть IV. Исследование браузеров 375
Глава 12. Работа с моделью DOM 377
12.1. Вставка HTML-кода в объектную модель документа 378
12.1.1. Преобразование из формата HTML в структуру DOM 379
Secrets_of_the_JavaScript_Ninja_Second_Edition.indb 10 ecrets_of_the_JavaScript_Ninja_Second_Edition.indb 10 04.09.2017 14:08:55 4.09.2017 14:08:55
Содержание 11
12.1.2. Вставка элементов разметки в документ 384
12.2. Атрибуты и свойства модели DOM 386
12.3. Трудности обращения с атрибутами стилевого оформления 388
12.3.1. Местонахождение стилей 389
12.3.2. Именование свойств стилевого оформления 391
12.3.3. Извлечение вычисленных стилей 393
12.3.4. Преобразование значений, указываемых в пикселях 397
12.3.5. Указание размеров по высоте и ширине 398
12.4. Сведение к минимуму перегрузки верстки 403
Резюме 406
Упражнения 407
Глава 13. Особенности обработки событий 409
13.1. Углубленное исследование цикла ожидания событий 410
13.1.1. Пример только с очередью макрозадач 414
13.1.2. Пример с обеими очередями макро- и микрозадач 419
13.2. Овладение таймерами: тайм-ауты и интервалы времени 424
13.2.1. Запуск обработчиков таймера в цикле ожидания событий 425
13.2.2. Преодоление трудностей затратной обработки вычислений 432
13.3. Обработка событий 436
13.3.1. Распространение событий по модели DOM 437
13.3.2. Специальные события 444
Резюме 448
Упражнения 449
Глава 14. Стратегии разработки кросс-браузерного кода 451
14.1. Соображения по поводу кросс-браузерной разработки 452
14.2. Пять самых насущных задач разработки 455
14.2.1. Программные ошибки и отличия в браузерах 456
14.2.2. Преодоление программных ошибок в браузерах 456
14.2.3. Внешний код и разметка 458
14.2.4. Регрессии 463
14.3. Стратегии реализации 465
14.3.1. Надежное устранение ошибок в кросс-браузерном коде 465
14.3.2. Обнаружение функциональных средств и полифиллы 467
14.3.3. Области непроверяемых ошибок в браузерах 469
14.4. Сокращение допущений 472
Резюме 473
Упражнения 474
Часть V. Приложения 475
Приложение А. Дополнительные средства стандарта ES6 477
Шаблонные литералы 477
Secrets_of_the_JavaScript_Ninja_Second_Edition.indb 11 ecrets_of_the_JavaScript_Ninja_Second_Edition.indb 11 04.09.2017 14:08:55 4.09.2017 14:08:55
12 Содержание
Деструктурирование 479
Усовершенствованные литералы объектов 480
Приложение Б. Средства тестирования и отладки 483
Инструментальные средства для разработки и отладки веб-приложений 484
Firebug 484
Firefox Developer Tools 485
F12 Developer Tools 486
WebKit Inspector 487
Chrome DevTools 488
Отладка кода на JavaScript 488
Протоколирование 489
Точки останова 490
Заход в функцию 491
Создание тестов 494
Основы организации среды тестирования 497
Наиболее распространенные среды тестирования 499
QUnit 500
Jasmine 501
Измерение покрытия кода 502
Приложение В. Ответы на упражнения 505
Глава 2. Создание страницы в динамическом режиме 505
Глава 3. Функции высшего порядка для начинающих: определения и
аргументы 506
Глава 4. Функции для ученика мастера: представление об их вызове 507
Глава 5. Функции для мастера: замыкания и области видимости 510
Глава 6. Функции на перспективу: генераторы и обещания 512
Глава 7. Объектная ориентация с помощью прототипов 514
Глава 8. Управление доступом к объектам 517
Глава 9. Работа с коллекциями 520
Глава 10. Овладение регулярными выражениями 522
Глава 11. Методики модуляризации кода 525
Глава 12. Работа с моделью DOM 527
Глава 13. Особенности обработки событий 528
Глава 14. Стратегии разработки кросс-браузерного кода 530
Предметный указатель 533