HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>Рассказываем, как<a>использовать</a>брейкпоинты, чтобы специально приостанавливать выполнение кода на JavaScript, причем тут DevTools и зачем вообще нужен отладчик.</strong></p>
1 <p><strong>Рассказываем, как<a>использовать</a>брейкпоинты, чтобы специально приостанавливать выполнение кода на JavaScript, причем тут DevTools и зачем вообще нужен отладчик.</strong></p>
2 <h2>Содержание</h2>
2 <h2>Содержание</h2>
3 <ul><li><a>Когда использовать брейкпоинты и какие точки останова бывают</a></li>
3 <ul><li><a>Когда использовать брейкпоинты и какие точки останова бывают</a></li>
4 <li><a>Управление точками останова</a></li>
4 <li><a>Управление точками останова</a></li>
5 <li><a>Точки останова в DOM</a></li>
5 <li><a>Точки останова в DOM</a></li>
6 <li><a>Типы точек останова для изменения DOM</a></li>
6 <li><a>Типы точек останова для изменения DOM</a></li>
7 <li><a>Использование точек останова с XHR/Fetch</a></li>
7 <li><a>Использование точек останова с XHR/Fetch</a></li>
8 </ul><h2>Когда использовать брейкпоинты и какие точки останова бывают</h2>
8 </ul><h2>Когда использовать брейкпоинты и какие точки останова бывают</h2>
9 <p>Самый известный тип точек останова - это специальная инструкция debugger, которая приостанавливает выполнение кода. При этом у такого подхода есть нюансы - устанавливать брейкпоинт на строчку кода может быть неэффективно, если разработчик работает с большой кодовой базой, либо не может точно объяснить, где она находится.</p>
9 <p>Самый известный тип точек останова - это специальная инструкция debugger, которая приостанавливает выполнение кода. При этом у такого подхода есть нюансы - устанавливать брейкпоинт на строчку кода может быть неэффективно, если разработчик работает с большой кодовой базой, либо не может точно объяснить, где она находится.</p>
10 <p>Какие еще есть виды брейкпоинтов:</p>
10 <p>Какие еще есть виды брейкпоинтов:</p>
11 <ul><li>Условная строка кода. Находится в определенном месте, как и специальная инструкция, но выполняется только в случае, если верно какое-то из условий.</li>
11 <ul><li>Условная строка кода. Находится в определенном месте, как и специальная инструкция, но выполняется только в случае, если верно какое-то из условий.</li>
12 <li>DOM. Используется в коде, который изменяет или удаляет определенный узел DOM, либо его дочерние элементы.</li>
12 <li>DOM. Используется в коде, который изменяет или удаляет определенный узел DOM, либо его дочерние элементы.</li>
13 <li>XHR. Используется, когда URL-адрес в XHR содержит шаблон строки.</li>
13 <li>XHR. Используется, когда URL-адрес в XHR содержит шаблон строки.</li>
14 <li>Подписчик на события. Используется в коде, который автоматически запускается после запуска определенного события. Например, после выполнения действия клика.</li>
14 <li>Подписчик на события. Используется в коде, который автоматически запускается после запуска определенного события. Например, после выполнения действия клика.</li>
15 <li>Исключение. Работает в строке кода, которая вызывает пойманное или перехваченное исключение.</li>
15 <li>Исключение. Работает в строке кода, которая вызывает пойманное или перехваченное исключение.</li>
16 <li>Функции. Используется, когда вызывается определенная функция.</li>
16 <li>Функции. Используется, когда вызывается определенная функция.</li>
17 </ul><p>Дальше подробно расскажем, как устроены разные типы точек останова.</p>
17 </ul><p>Дальше подробно расскажем, как устроены разные типы точек останова.</p>
18 <blockquote><h3>Читайте также:</h3>
18 <blockquote><h3>Читайте также:</h3>
19 <p>Что такое [рекурсия, рекурсивный и итеративный процесс в программировании] (<a>https://ru.hexlet.io/blog/posts/recursive?utm_source=blog&amp;utm_medium=referal&amp;utm_content=recursive</a>)</p>
19 <p>Что такое [рекурсия, рекурсивный и итеративный процесс в программировании] (<a>https://ru.hexlet.io/blog/posts/recursive?utm_source=blog&amp;utm_medium=referal&amp;utm_content=recursive</a>)</p>
20 </blockquote><h3>Точки останова в коде через DevTools</h3>
20 </blockquote><h3>Точки останова в коде через DevTools</h3>
21 <p>Брейкпоинты обычно используются в специальной строке кода - это позволяет сделать паузу перед выполнением этой строчки кода. Важная особенность: разработчик должен знать точное место, где нужно приостановить выполнение кода.</p>
21 <p>Брейкпоинты обычно используются в специальной строке кода - это позволяет сделать паузу перед выполнением этой строчки кода. Важная особенность: разработчик должен знать точное место, где нужно приостановить выполнение кода.</p>
22 <p>Открыть DevTools из браузера Google Chrome можно двумя способами:</p>
22 <p>Открыть DevTools из браузера Google Chrome можно двумя способами:</p>
23 <ol><li>Сочетанием горячих клавиш: для Windows и Linux - Ctrl + Shift + I, а для macOS cmd + Shift + I.</li>
23 <ol><li>Сочетанием горячих клавиш: для Windows и Linux - Ctrl + Shift + I, а для macOS cmd + Shift + I.</li>
24 <li>Через интерфейс: для этого на странице нужно кликнуть правой кнопкой мыши в любом месте и выбрать "Просмотреть код". Более подробно про работу с DevTools читайте в нашей большой<a>статье</a>.</li>
24 <li>Через интерфейс: для этого на странице нужно кликнуть правой кнопкой мыши в любом месте и выбрать "Просмотреть код". Более подробно про работу с DevTools читайте в нашей большой<a>статье</a>.</li>
25 </ol><p>Вот что нужно сделать для того, чтобы установить точку останова строки кода в DevTools.</p>
25 </ol><p>Вот что нужно сделать для того, чтобы установить точку останова строки кода в DevTools.</p>
26 <ul><li>Перейдите во вкладку Sources</li>
26 <ul><li>Перейдите во вкладку Sources</li>
27 <li>Выберите файл, который содержит строку кода, где нужно поставить брейкпоинт</li>
27 <li>Выберите файл, который содержит строку кода, где нужно поставить брейкпоинт</li>
28 <li>Найдите нужную строчку</li>
28 <li>Найдите нужную строчку</li>
29 <li>Слева от строки находится столбец с ее номером. Если на него нажать, то появится синий значок - это и есть брейкпоинт.</li>
29 <li>Слева от строки находится столбец с ее номером. Если на него нажать, то появится синий значок - это и есть брейкпоинт.</li>
30 </ul><h3>Точки останова в коде, который специально поставил разработчик</h3>
30 </ul><h3>Точки останова в коде, который специально поставил разработчик</h3>
31 <p>Для создания такого брейкпоинта нужно просто вызвать debugger в коде. Этот подход эквивалентен предыдущему способу, через DevTools, только без использования визуального интерфейса.</p>
31 <p>Для создания такого брейкпоинта нужно просто вызвать debugger в коде. Этот подход эквивалентен предыдущему способу, через DevTools, только без использования визуального интерфейса.</p>
32 <h3>Точки останова для условий</h3>
32 <h3>Точки останова для условий</h3>
33 <p>Условный брейкпоинт в строке кода используется, когда разработчик знает область кода, которую нужно исследовать, но хочет сделать паузу только в случае выполнения какого-то определенного условия.</p>
33 <p>Условный брейкпоинт в строке кода используется, когда разработчик знает область кода, которую нужно исследовать, но хочет сделать паузу только в случае выполнения какого-то определенного условия.</p>
34 <p>Как установить условный брейкпоинт:</p>
34 <p>Как установить условный брейкпоинт:</p>
35 <ul><li>Перейдите во вкладку Sources</li>
35 <ul><li>Перейдите во вкладку Sources</li>
36 <li>Выберите файл, который содержит строку кода, где нужно поставить брейкпоинт</li>
36 <li>Выберите файл, который содержит строку кода, где нужно поставить брейкпоинт</li>
37 <li>Найдите нужную строчку</li>
37 <li>Найдите нужную строчку</li>
38 <li>Слева от строки кода находится столбец с ее номером (да, пока все как при установке обычной точки останова). Щелкните на него правой кнопкой мыши</li>
38 <li>Слева от строки кода находится столбец с ее номером (да, пока все как при установке обычной точки останова). Щелкните на него правой кнопкой мыши</li>
39 <li>Выберите Add conditional breakpoint. Под строчкой кода появится диалоговое окно</li>
39 <li>Выберите Add conditional breakpoint. Под строчкой кода появится диалоговое окно</li>
40 <li>Добавьте условие, при котором должен срабатывать брейкпоинт</li>
40 <li>Добавьте условие, при котором должен срабатывать брейкпоинт</li>
41 <li>Нажмите Enter, чтобы активировать точку останова. После этого около строчки появится оранжевый значок.</li>
41 <li>Нажмите Enter, чтобы активировать точку останова. После этого около строчки появится оранжевый значок.</li>
42 </ul><h2>Управление точками останова</h2>
42 </ul><h2>Управление точками останова</h2>
43 <p>Управлять брейкпоинтами можно с помощью плашки breakpoints во вкладке<em>Sources</em>через Devtools.</p>
43 <p>Управлять брейкпоинтами можно с помощью плашки breakpoints во вкладке<em>Sources</em>через Devtools.</p>
44 <ul><li>Чтобы отключить брейкпоинт, достаточно убрать галочку рядом с ним</li>
44 <ul><li>Чтобы отключить брейкпоинт, достаточно убрать галочку рядом с ним</li>
45 <li>Удалить брейкпоинт можно с помощью нажатия на правую кнопку мыши около точки останова</li>
45 <li>Удалить брейкпоинт можно с помощью нажатия на правую кнопку мыши около точки останова</li>
46 <li>Щелкните правой кнопкой мыши в любом месте панели Breakpoints, чтобы деактивировать сразу же все точки останова. Таким же образом можно их включить обратно, либо удалить. Отключение всех брейкпоинтов эквивалентно снятию галочки со всех точек останова - то есть DevTools будет полностью их игнорировать во всех местах в коде.</li>
46 <li>Щелкните правой кнопкой мыши в любом месте панели Breakpoints, чтобы деактивировать сразу же все точки останова. Таким же образом можно их включить обратно, либо удалить. Отключение всех брейкпоинтов эквивалентно снятию галочки со всех точек останова - то есть DevTools будет полностью их игнорировать во всех местах в коде.</li>
47 </ul><h2>Точки останова в DOM</h2>
47 </ul><h2>Точки останова в DOM</h2>
48 <p>Используйте брейкпоинты изменения DOM, если вы собираетесь приостановить код, который изменяет узел DOM или его дочерние элементы.</p>
48 <p>Используйте брейкпоинты изменения DOM, если вы собираетесь приостановить код, который изменяет узел DOM или его дочерние элементы.</p>
49 <p>Как это сделать:</p>
49 <p>Как это сделать:</p>
50 <ul><li>Перейдите во вкладку Elements</li>
50 <ul><li>Перейдите во вкладку Elements</li>
51 <li>Найдите элемент, на который нужно установить брейкпоинт</li>
51 <li>Найдите элемент, на который нужно установить брейкпоинт</li>
52 <li>Нажмите на элемент правой кнопкой мыши</li>
52 <li>Нажмите на элемент правой кнопкой мыши</li>
53 <li>Наведите мышь на Break on, а затем выберите Subtree modifications, Attribute modifications или Node removal в зависимости от того, что вы хотите сделать. Ниже расскажем, что это такое и как работает.</li>
53 <li>Наведите мышь на Break on, а затем выберите Subtree modifications, Attribute modifications или Node removal в зависимости от того, что вы хотите сделать. Ниже расскажем, что это такое и как работает.</li>
54 </ul><h2>Типы точек останова для изменения DOM</h2>
54 </ul><h2>Типы точек останова для изменения DOM</h2>
55 <p>Subtree modifications - запускается, когда дочерний элемент выбранного узла удаляется или добавляется. Либо изменяется содержимое дочернего элемента. Subtree modifications не надо запускать при изменении атрибутов дочернего узла или при любых изменениях выбранного в данный момент узла.</p>
55 <p>Subtree modifications - запускается, когда дочерний элемент выбранного узла удаляется или добавляется. Либо изменяется содержимое дочернего элемента. Subtree modifications не надо запускать при изменении атрибутов дочернего узла или при любых изменениях выбранного в данный момент узла.</p>
56 <p>Attribute modifications - запускается, когда пользователь добавляет или удаляет атрибут у выбранного в данный момент узла. Также Attribute modifications запускается при изменении значения атрибута.</p>
56 <p>Attribute modifications - запускается, когда пользователь добавляет или удаляет атрибут у выбранного в данный момент узла. Также Attribute modifications запускается при изменении значения атрибута.</p>
57 <p>Node removal - срабатывает, когда текущий выбранный узел удаляется.</p>
57 <p>Node removal - срабатывает, когда текущий выбранный узел удаляется.</p>
58 <blockquote><h3>Читайте также:</h3>
58 <blockquote><h3>Читайте также:</h3>
59 <p>Что такое [callback-функция в JavaScript?] (<a>https://ru.hexlet.io/blog/posts/javascript-what-the-heck-is-a-callback?utm_source=blog&amp;utm_medium=referal&amp;utm_content=callback</a>)</p>
59 <p>Что такое [callback-функция в JavaScript?] (<a>https://ru.hexlet.io/blog/posts/javascript-what-the-heck-is-a-callback?utm_source=blog&amp;utm_medium=referal&amp;utm_content=callback</a>)</p>
60 </blockquote><h2>Использование точек останова с XHR/Fetch</h2>
60 </blockquote><h2>Использование точек останова с XHR/Fetch</h2>
61 <p>Используйте брейкпоинты с XHR, если выполнение кода нужно прервать, когда URL-адрес запроса XHR содержит заранее указанную строку. DevTools остановится на той строке кода, где XHR вызывает функцию send(). Эта же функция также работает с Fetch API.</p>
61 <p>Используйте брейкпоинты с XHR, если выполнение кода нужно прервать, когда URL-адрес запроса XHR содержит заранее указанную строку. DevTools остановится на той строке кода, где XHR вызывает функцию send(). Эта же функция также работает с Fetch API.</p>
62 <p>Один из случаев, когда можно использовать эту точку останова - если вы увидите, что страница запрашивает неверный URL, и нужно быстро найти исходный код AJAX или Fetch, вызывающий неверный запрос.</p>
62 <p>Один из случаев, когда можно использовать эту точку останова - если вы увидите, что страница запрашивает неверный URL, и нужно быстро найти исходный код AJAX или Fetch, вызывающий неверный запрос.</p>
63 <p>Как установить брейкпоинт для XHR:</p>
63 <p>Как установить брейкпоинт для XHR:</p>
64 <ul><li>Перейдите во вкладку Sources</li>
64 <ul><li>Перейдите во вкладку Sources</li>
65 <li>Откройте панель XHR Breakpoints</li>
65 <li>Откройте панель XHR Breakpoints</li>
66 <li>Нажмите Add breakpoint</li>
66 <li>Нажмите Add breakpoint</li>
67 <li>Введите строку, во время появления которой должен срабатывать брейкпоинт. То есть DevTools будет приостанавливать выполнение кода, если эта строка будет присутствовать в URL-адресе запроса XHR.</li>
67 <li>Введите строку, во время появления которой должен срабатывать брейкпоинт. То есть DevTools будет приостанавливать выполнение кода, если эта строка будет присутствовать в URL-адресе запроса XHR.</li>
68 <li>Нажмите Enter для подтверждения.</li>
68 <li>Нажмите Enter для подтверждения.</li>
69 </ul><h3>Точки останова для обработчика событий</h3>
69 </ul><h3>Точки останова для обработчика событий</h3>
70 <p>Используйте брейкпоинт для остановки обработчика событий, если нужно приостановить код Event listener, который начинает работать после запуска события. Этот брейкпоинт можно установить после запуска определенного события, такого как клик или движение мышки.</p>
70 <p>Используйте брейкпоинт для остановки обработчика событий, если нужно приостановить код Event listener, который начинает работать после запуска события. Этот брейкпоинт можно установить после запуска определенного события, такого как клик или движение мышки.</p>
71 <p>Как установить брейкпоинт для обработчика событий:</p>
71 <p>Как установить брейкпоинт для обработчика событий:</p>
72 <ul><li>Перейдите во вкладку Sources</li>
72 <ul><li>Перейдите во вкладку Sources</li>
73 <li>Откройте вкладку Event Listener Breakpoints. DevTools покажет список различных категорий событий, таких как Animation.</li>
73 <li>Откройте вкладку Event Listener Breakpoints. DevTools покажет список различных категорий событий, таких как Animation.</li>
74 <li>Отметьте одну из категорий, чтобы брейкпоинт срабатывал при запуске любого события из этой категории.</li>
74 <li>Отметьте одну из категорий, чтобы брейкпоинт срабатывал при запуске любого события из этой категории.</li>
75 </ul><h3>Точки останова для исключений</h3>
75 </ul><h3>Точки останова для исключений</h3>
76 <p>Используйте брейкпоинты, если нужно остановить выполнение кода, которое вызывает перехваченное или необработанное исключение.</p>
76 <p>Используйте брейкпоинты, если нужно остановить выполнение кода, которое вызывает перехваченное или необработанное исключение.</p>
77 <p>Как запустить брейкпоинты для исключений:</p>
77 <p>Как запустить брейкпоинты для исключений:</p>
78 <ul><li>Перейдите во вкладку<em>Sources</em></li>
78 <ul><li>Перейдите во вкладку<em>Sources</em></li>
79 <li>Нажмите<em>Pause on exceptions</em>. При включении кнопка становится синей.</li>
79 <li>Нажмите<em>Pause on exceptions</em>. При включении кнопка становится синей.</li>
80 </ul><ul><li>Установите флажок<em>Pause On Caught Exceptions</em>, если вы хотите приостанавливать все перехваченные исключения в дополнение к необработанным. Это необязательный пункт.</li>
80 </ul><ul><li>Установите флажок<em>Pause On Caught Exceptions</em>, если вы хотите приостанавливать все перехваченные исключения в дополнение к необработанным. Это необязательный пункт.</li>
81 </ul><h3>Точки останова для функций</h3>
81 </ul><h3>Точки останова для функций</h3>
82 <p>Можно вызывать debug(functionName), где functionName - это имя функции, которую вы собираетесь отладить. Она будет вызывать брейкпоинты каждый раз перед выполнением, чтобы ее можно было спокойно отдебажить.</p>
82 <p>Можно вызывать debug(functionName), где functionName - это имя функции, которую вы собираетесь отладить. Она будет вызывать брейкпоинты каждый раз перед выполнением, чтобы ее можно было спокойно отдебажить.</p>
83 <p>Для приостановки выполнения кода можно как вставить debug() в код, так и вызвать его в DevTools. При этом debug() будет эквивалентна установке брейкпоинта в первой строчке кода функции:</p>
83 <p>Для приостановки выполнения кода можно как вставить debug() в код, так и вызвать его в DevTools. При этом debug() будет эквивалентна установке брейкпоинта в первой строчке кода функции:</p>
84 <p>Убедитесь, что ваша функция находится в области видимости.</p>
84 <p>Убедитесь, что ваша функция находится в области видимости.</p>
85 <p>DevTools выдает ReferenceError, если функция, которую вы хотите отлаживать, не входит в область действия.</p>
85 <p>DevTools выдает ReferenceError, если функция, которую вы хотите отлаживать, не входит в область действия.</p>
86 - <p>При этом убедиться, что функция находится в нужной области видимости, может быть достаточно сложно, особенно если вы используете debug() нутри консоли в DevTools. Как это можно исправить:</p>
86 + <p>При этом убедиться, что функция находится в нужной области видимости, может быть достаточно сложно, особенно если вы используете debug() внутри консоли в DevTools. Как это можно исправить:</p>
87 <ul><li>Установите брейкпоинт там, где ваша функция находится в области видимости</li>
87 <ul><li>Установите брейкпоинт там, где ваша функция находится в области видимости</li>
88 <li>Запустите точку останова</li>
88 <li>Запустите точку останова</li>
89 <li>Вызовите debug() в консоли DevTools в то время, пока действие кода все еще приостановлено через брейкпоинт.</li>
89 <li>Вызовите debug() в консоли DevTools в то время, пока действие кода все еще приостановлено через брейкпоинт.</li>
90 </ul><blockquote><h3>Никогда не останавливайтесь:</h3>
90 </ul><blockquote><h3>Никогда не останавливайтесь:</h3>
91 <p>В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами - на Хекслете есть<a>сотни курсов по разработке на разных языках и технологиях</a></p>
91 <p>В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами - на Хекслете есть<a>сотни курсов по разработке на разных языках и технологиях</a></p>
92 </blockquote>
92 </blockquote>