
- •Введение
- •Введение в JavaScript
- •Справочники и спецификации
- •Редакторы для кода
- •Консоль разработчика
- •Основы JavaScript
- •Привет, мир!
- •Внешние скрипты, порядок исполнения
- •Структура кода
- •Современный стандарт, «use strict»
- •Переменные
- •Правильный выбор имени переменной
- •Шесть типов данных, typeof
- •Основные операторы
- •Операторы сравнения и логические значения
- •Побитовые операторы
- •Взаимодействие с пользователем: alert, prompt, confirm
- •Условные операторы: if, '?'
- •Логические операторы
- •Преобразование типов для примитивов
- •Циклы while, for
- •Конструкция switch
- •Функции
- •Функциональные выражения
- •Именованные функциональные выражения
- •Всё вместе: особенности JavaScript
- •Качество кода
- •Отладка в браузере Chrome
- •Советы по стилю кода
- •Как писать неподдерживаемый код?
- •Автоматические тесты при помощи chai и mocha
- •Структуры данных
- •Введение в методы и свойства
- •Числа
- •Строки
- •Объекты как ассоциативные массивы
- •Объекты: перебор свойств
- •Объекты: передача по ссылке
- •Массивы c числовыми индексами
- •Массивы: методы
- •Массив: перебирающие методы
- •Псевдомассив аргументов «arguments»
- •Дата и Время
- •Замыкания, область видимости
- •Глобальный объект
- •Замыкания, функции изнутри
- •[[Scope]] для new Function
- •Локальные переменные для объекта
- •Модули через замыкания
- •Управление памятью в JavaScript
- •Устаревшая конструкция «with»
- •Методы объектов и контекст вызова
- •Методы объектов, this
- •Преобразование объектов: toString и valueOf
- •Создание объектов через «new»
- •Дескрипторы, геттеры и сеттеры свойств
- •Статические и фабричные методы
- •Явное указание this: «call», «apply»
- •Привязка контекста и карринг: «bind»
- •Функции-обёртки, декораторы
- •Некоторые другие возможности
- •Типы данных: [[Class]], instanceof и утки
- •Формат JSON, метод toJSON
- •setTimeout и setInterval
- •Запуск кода из строки: eval
- •Перехват ошибок, «try..catch»
- •ООП в функциональном стиле
- •Введение
- •Внутренний и внешний интерфейс
- •Геттеры и сеттеры
- •Функциональное наследование
- •ООП в прототипном стиле
- •Прототип объекта
- •Свойство F.prototype и создание объектов через new
- •Встроенные «классы» в JavaScript
- •Свои классы на прототипах
- •Наследование классов в JavaScript
- •Проверка класса: «instanceof»
- •Свои ошибки, наследование от Error

Если объявление функции является частью какого-либо выражения, например var = function...
или любого другого, то это Function Expression.
В этом случае функции можно присвоить «внутреннее» имя, указав его после function. Оно будет
видно только внутри этой функции и позволяет обратиться к функции изнутри себя. Обычно это используется для рекурсивных вызовов.
Например, создадим функцию для вычисления факториала как Function Expression и дадим ей имя me:
var factorial = function me(n) { return (n == 1) ? n : n * me(n 1);
}
alert( factorial(5) ); // 120
alert( me ); // ошибка, нет такой переменной
Ограничение видимости для имени не работает в IE8-, но вызов с его помощью работает во всех браузерах.
Более развёрнуто: Именованные функциональные выражения.
Итого
В этой главе мы повторили основные особенности JavaScript, знание которых необходимо для обхода большинства «граблей», да и просто для написания хорошего кода.
Это, конечно, лишь основы. Дальше вы узнаете много других особенностей и приёмов программирования на этом языке.
Качество кода
Для того, чтобы код был качественным, необходимы как минимум:
1.Умение отладить код и поправить ошибки.
2.Хороший стиль кода.
3.Тестировать код, желательно — в автоматическом режиме.
Отладка в браузере Chrome
Перед тем, как двигаться дальше, поговорим об отладке скриптов.
Все современные браузеры поддерживают для этого «инструменты разработчика». Исправление ошибок с их помощью намного проще и быстрее.
На текущий момент самые многофункциональные инструменты — в браузере Chrome. Также очень хорош Firebug (для Firefox).

Общий вид панели Sources
В вашей версии Chrome панель может выглядеть несколько по-иному, но что где находится, должно быть понятно.
Зайдите на страницу с примером браузером Chrome.
Откройте инструменты разработчика: F12или в меню Инструменты > Инструменты Разработчика.
Выберите сверху Sources.
Вы видите три зоны:
1.Зона исходных файлов. В ней находятся все подключённые к странице файлы, включая JS/CSS. Выберите pow.js, если он не выбран.
2.Зона текста. В ней находится текст файлов.
3.Зона информации и контроля. Мы поговорим о ней позже.
Обычно зона исходных файлов при отладке не нужна. Скройте её кнопкой .
Общие кнопки управления

Три наиболее часто используемые кнопки управления:
Формат
Нажатие форматирует текст текущего файла, расставляет отступы. Нужна, если вы хотите разобраться в чужом коде, плохо отформатированном или сжатом.
Консоль
Очень полезная кнопка, открывает тут же консоль для запуска команд. Можно смотреть код и тут же запускайть функции. Её нажатие можно заменить на клавишу Esc.
Окно
Если код очень большой, то можно вынести инструменты разработки вбок или в отдельное окно, зажав эту кнопку и выбрав соответствующий вариант из списка.
Точки остановки
Открыли файл pow.jsво вкладке Sources? Кликните на 6й строке файла pow.js, прямо на цифре 6.
Поздравляю! Вы поставили «точку остановки» или, как чаще говорят, «брейкпойнт».
Выглядет это должно примерно так:

Слово Брейкпойнт (breakpoint) — часто используемый английский жаргонизм. Это то место в коде,
где отладчик будет автоматически останавливать выполнение JavaScript, как только оно до него дойдёт.
В остановленном коде можно посмотреть текущие значения переменных, выполнять команды и т.п., в общем — отлаживать его.
Вы можете видеть, что информация о точке остановки появилась справа, в подвкладке Breakpoints.
Вкладка Breakpoints очень удобна, когда код большой, она позволяет:
●Быстро перейти на место кода, где стоит брейкпойнт кликом на текст.
●Временно выключить брейкпойнт кликом на чекбокс.
●Быстро удалить брейкпойнт правым кликом на текст и выбором Remove, и так далее.
Дополнительные возможности
● Остановку можно инициировать и напрямую из кода скрипта, командой debugger:
function pow(x, n) {
...
debugger; // < отладчик остановится тут
...
}
●Правый клик на номер строки pow.jsпозволит создать условную точку остановки (conditional breakpoint), т.е. задать условие, при котором точка остановки сработает.
Это удобно, если остановка нужна только при определённом значении переменной или параметра функции.
Остановиться и осмотреться
Наша функция выполняется сразу при загрузке страницы, так что самый простой способ активировать отладчик JavaScript — перезагрузить её. Итак, нажимаем F5(Windows, Linux) или
Cmd+R(Mac).
Если вы сделали всё, как описано выше, то выполнение прервётся как раз на 6й строке.

Обратите внимание на информационные вкладки справа (отмечены стрелками).
Вних мы можем посмотреть текущее состояние:
1.Watch Expressions— показывает текущие значения любых выражений.
Можно раскрыть эту вкладку, нажать мышью +на ней и ввести любое выражение. Отладчик будет
отображать его значение на текущий момент, автоматически перевычисляя его при проходе по коду.
2.Call Stack— стек вызовов, все вложенные вызовы, которые привели к текущему месту кода.
На текущий момент видно, отладчик находится в функции pow(pow.js, строка 6), вызванной из анонимного кода (index.html, строка 13).
3.Scope Variables— переменные.
На текущий момент строка 6 ещё не выполнилась, поэтому resultравен undefined.
ВLocalпоказываются переменные функции: объявленные через varи параметры. Вы также можете там видеть ключевое слово this, если вы не знаете, что это такое — ничего страшного, мы это обсудим позже, в следующих главах учебника.
ВGlobal— глобальные переменные и функции.
Управление выполнением
Пришло время, как говорят, «погонять» скрипт и «оттрейсить» (от англ. trace — отслеживать) его работу.
Обратим внимание на панель управления справа-сверху, в ней есть 6 кнопок:

— продолжить выполнение, горячая клавиша F8.
Продолжает выполнения скрипта с текущего момента в обычном режиме. Если скрипт не встретит новых точек остановки, то в отладчик управление больше не вернётся.
Нажмите на эту кнопку.
Скрипт продолжится, далее, в 6й строке находится рекурсивный вызов функции pow, т.е. управление
перейдёт в неё опять (с другими аргументами) и сработает точка остановки, вновь включая отладчик.
При этом вы увидите, что выполнение стоит на той же строке, но в Call Stackпоявился новый вызов.
Походите по стеку вверх-вниз — вы увидите, что действительно аргументы разные.
— сделать шаг, не заходя внутрь функции, горячая клавиша F10.
Выполняет одну команду скрипта. Если в ней есть вызов функции — то отладчик обходит его стороной, т.е. не переходит на код внутри.
Эта кнопка очень удобна, если в текущей строке вызывается функция JS-фреймворка или какая-то другая, которая нас ну совсем не интересует. Тогда выполнение продолжится дальше, без захода в эту функцию, что нам и нужно.
Обратим внимание, в данном случае эта кнопка при нажатии всё-таки перейдёт внутрь вложенного вызова pow, так как внутри powнаходится брейкпойнт, а на включённых брейкпойнтах отладчик
останавливается всегда.
— сделать шаг, горячая клавиша F11.
Выполняет одну команду скрипта и переходит к следующей. Если есть вложенный вызов, то заходит внутрь функции.
Эта кнопка позволяет подробнейшим образом пройтись по очереди по командам скрипта.
— выполнять до выхода из текущей функции, горячая клавиша Shift+F11.
Выполняет команды до завершения текущей функции.
Эта кнопка очень удобна в случае, если мы нечаянно вошли во вложенный вызов, который нам не интересен — чтобы быстро из него выйти.
— отключить/включить все точки остановки.
Эта кнопка никак не двигает нас по коду, она позволяет временно отключить все точки остановки в файле.
— включить/отключить автоматическую остановку при ошибке.
Эта кнопка — одна из самых важных.
Нажмите её несколько раз. В старых версиях Chrome у неё три режима — нужен фиолетовый, в новых — два, тогда достаточно синего.

Когда она включена, то при ошибке в коде он автоматически остановится и мы сможем посмотреть в
отладчике текущие значения переменных, при желании выполнить команды и выяснить, как так получилось.
Процесс отладки заключается в том, что мы останавливаем скрипт, смотрим, что с переменными, переходим дальше и ищем, где поведение отклоняется от правильного.
Continue to here
Правый клик на номер строки открывает контекстное меню, в котором можно запустить выполнение кода до неё (Continue to here). Это удобно, когда хочется сразу прыгнуть вперёд и breakpoint неохота ставить.
Консоль
При отладке, кроме просмотра переменных и передвижения по скрипту, бывает полезно запускать команды JavaScript. Для этого нужна консоль.
В неё можно перейти, нажав кнопку «Console» вверху-справа, а можно и открыть в дополнение к отладчику, нажав на кнопку или клавишей ESC.
Самая любимая команда разработчиков: console.log(...).
Она пишет переданные ей аргументы в консоль, например:
// результат будет виден в консоли for (var i = 0; i < 5; i++) {
console.log("значение", i);
}
Полную информацию по специальным командам консоли вы можете получить на странице Chrome Console API и Chrome CommandLine API . Почти все команды также действуют в Firebug (отладчик для браузера Firefox).
Консоль поддерживают все браузеры, и, хотя IE10поддерживает далеко не все функции, но console.logработает везде. Используйте его для вывода отладочной информации по ходу работы
скрипта.
Ошибки
Ошибки JavaScript выводятся в консоли.
Например, прервите отладку — для этого достаточно закрыть инструменты разрабтчика — и откройте страницу с ошибкой .
Перейдите во вкладку Console инструментов разработчика ( Ctrl+Shift+J/ Cmd+Shift+J).
В консоли вы увидите что-то подобное:

Красная строка — это сообщение об ошибке.
Если кликнуть на ссылке pow.jsв консоли, справа в строке с ошибкой, то мы перейдём непосредственно к месту в скрипте, где возникла ошибка.
Однако почему она возникла?
Более подробно прояснить произошедшее нам поможет отладчик. Он может «заморозить» выполнение скрипта на момент ошибки и дать нам возможность посмотреть значения переменных и стека на тот момент.
Для этого:
1.Перейдите на вкладку Sources.
2.Включите останов при ошибке, кликнув на кнопку
3.Перезагрузите страницу.
После перезагрузки страницы JavaScript-код запустится снова и отладчик остановит выполнение на строке с ошибкой:
Можно посмотреть значения переменных. Открыть консоль и попробовать запустить что-то в ней.