0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>14 июл 2025</li>
2
<ul><li>14 июл 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Руководство для тех, кто только начинает изучать JavaScript.</p>
4
</ul><p>Руководство для тех, кто только начинает изучать JavaScript.</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
6
<p>Автор статей о программировании. 14 лет в IT. Умеет рассказывать о технологиях простыми словами. Автор спецпроекта Advertising for Social Change.</p>
6
<p>Автор статей о программировании. 14 лет в IT. Умеет рассказывать о технологиях простыми словами. Автор спецпроекта Advertising for Social Change.</p>
7
<p>Функции - один из самых важных инструментов в JavaScript. С их помощью можно структурировать код, переиспользовать логику и делать программу проще для чтения и поддержки. В этой статье разберём, что такое функции, как их правильно объявлять и вызывать, что такое<em>return</em>, this, замыкания и как избежать типичных ошибок.</p>
7
<p>Функции - один из самых важных инструментов в JavaScript. С их помощью можно структурировать код, переиспользовать логику и делать программу проще для чтения и поддержки. В этой статье разберём, что такое функции, как их правильно объявлять и вызывать, что такое<em>return</em>, this, замыкания и как избежать типичных ошибок.</p>
8
<p><strong>Содержание</strong></p>
8
<p><strong>Содержание</strong></p>
9
<ul><li><a>Зачем вообще нужны функции</a></li>
9
<ul><li><a>Зачем вообще нужны функции</a></li>
10
<li><a>Как устроена функция</a></li>
10
<li><a>Как устроена функция</a></li>
11
<li><a>Как объявить функцию</a></li>
11
<li><a>Как объявить функцию</a></li>
12
<li><a>Как вызвать функцию</a></li>
12
<li><a>Как вызвать функцию</a></li>
13
<li><a>Как передавать данные</a></li>
13
<li><a>Как передавать данные</a></li>
14
<li><a>Как вернуть результат из функции: оператор return</a></li>
14
<li><a>Как вернуть результат из функции: оператор return</a></li>
15
<li><a>Области видимости: глобальная и локальная</a></li>
15
<li><a>Области видимости: глобальная и локальная</a></li>
16
<li><a>Объявление функции через function expression</a></li>
16
<li><a>Объявление функции через function expression</a></li>
17
<li><a>Стрелочные функции (arrow functions)</a></li>
17
<li><a>Стрелочные функции (arrow functions)</a></li>
18
<li><a>This: как работает контекст выполнения</a></li>
18
<li><a>This: как работает контекст выполнения</a></li>
19
<li><a>Типичные ошибки: как их избежать</a></li>
19
<li><a>Типичные ошибки: как их избежать</a></li>
20
<li><a>Советы и лайфхаки для работы</a></li>
20
<li><a>Советы и лайфхаки для работы</a></li>
21
</ul><p>Во многих веб-проектах разработчики выполняют одни и те же действия: проверяют формы, открывают модальные окна, управляют выпадающими меню.</p>
21
</ul><p>Во многих веб-проектах разработчики выполняют одни и те же действия: проверяют формы, открывают модальные окна, управляют выпадающими меню.</p>
22
<p>Если каждый раз писать один и тот же код, он начинает дублироваться во всём проекте. Когда нужно внести правку, приходится менять все копии. Это долго, и легко ошибиться, а ещё код становится длиннее и сложнее для чтения.</p>
22
<p>Если каждый раз писать один и тот же код, он начинает дублироваться во всём проекте. Когда нужно внести правку, приходится менять все копии. Это долго, и легко ошибиться, а ещё код становится длиннее и сложнее для чтения.</p>
23
<p>Функции решают эту проблему. С их помощью можно один раз описать нужное поведение, а потом просто вызывать его в нужных местах. Это удобно, сокращает количество строк и делает код чище.</p>
23
<p>Функции решают эту проблему. С их помощью можно один раз описать нужное поведение, а потом просто вызывать его в нужных местах. Это удобно, сокращает количество строк и делает код чище.</p>
24
<p>Такой подход помогает:</p>
24
<p>Такой подход помогает:</p>
25
<ul><li>сократить объём кода - не нужно повторять одни и те же фрагменты,</li>
25
<ul><li>сократить объём кода - не нужно повторять одни и те же фрагменты,</li>
26
<li>улучшить читаемость - можно называть действия своими именами,</li>
26
<li>улучшить читаемость - можно называть действия своими именами,</li>
27
<li>упростить сопровождение - правки в одном месте срабатывают везде.</li>
27
<li>упростить сопровождение - правки в одном месте срабатывают везде.</li>
28
</ul><p>Это особенно важно в JavaScript, где многие интерфейсные действия повторяются десятки раз. Без функций код быстро выходит из-под контроля.</p>
28
</ul><p>Это особенно важно в JavaScript, где многие интерфейсные действия повторяются десятки раз. Без функций код быстро выходит из-под контроля.</p>
29
<p>Функция - это самостоятельный блок кода, который можно вызывать в любом месте программы. Она может принимать входные данные, выполнять действия и возвращать результат.</p>
29
<p>Функция - это самостоятельный блок кода, который можно вызывать в любом месте программы. Она может принимать входные данные, выполнять действия и возвращать результат.</p>
30
<p>Пример простой функции:</p>
30
<p>Пример простой функции:</p>
31
function sayHello() { console.log("Привет!"); } sayHello();<p>Здесь:</p>
31
function sayHello() { console.log("Привет!"); } sayHello();<p>Здесь:</p>
32
<ul><li>мы объявили функцию sayHello();</li>
32
<ul><li>мы объявили функцию sayHello();</li>
33
<li>написали, что она должна делать, - вывести сообщение в консоль;</li>
33
<li>написали, что она должна делать, - вывести сообщение в консоль;</li>
34
<li>вызвали функцию по имени.</li>
34
<li>вызвали функцию по имени.</li>
35
</ul><p>Функция срабатывает, когда мы её вызываем. Если не вызвать, она просто будет существовать в коде без действия.</p>
35
</ul><p>Функция срабатывает, когда мы её вызываем. Если не вызвать, она просто будет существовать в коде без действия.</p>
36
<p>Формально любая функция в JavaScript проходит три этапа:</p>
36
<p>Формально любая функция в JavaScript проходит три этапа:</p>
37
<ul><li><strong>Объявление</strong> - создаём функцию и даём ей имя.</li>
37
<ul><li><strong>Объявление</strong> - создаём функцию и даём ей имя.</li>
38
<li><strong>Определение поведения</strong> - пишем, что именно она должна делать.</li>
38
<li><strong>Определение поведения</strong> - пишем, что именно она должна делать.</li>
39
<li><strong>Вызов</strong> - запускаем выполнение по имени с помощью круглых скобок.</li>
39
<li><strong>Вызов</strong> - запускаем выполнение по имени с помощью круглых скобок.</li>
40
</ul><p>Это простой и надёжный способ структурировать код. Вместо того чтобы повторять одно и то же - пишем один раз, вызываем сколько угодно.</p>
40
</ul><p>Это простой и надёжный способ структурировать код. Вместо того чтобы повторять одно и то же - пишем один раз, вызываем сколько угодно.</p>
41
<p>Кстати, есть и исключения. Некоторые функции в JavaScript создаются прямо на лету, во время выполнения программ. О них мы расскажем чуть позже.</p>
41
<p>Кстати, есть и исключения. Некоторые функции в JavaScript создаются прямо на лету, во время выполнения программ. О них мы расскажем чуть позже.</p>
42
<p>Чтобы объявить функцию, начните с ключевого слова function, укажите имя, круглые скобки для параметров (даже если их нет), а затем - фигурные скобки с кодом внутри.</p>
42
<p>Чтобы объявить функцию, начните с ключевого слова function, укажите имя, круглые скобки для параметров (даже если их нет), а затем - фигурные скобки с кодом внутри.</p>
43
function sayHello() { console.log("Привет, мир!"); }<p>Этот код создаёт функцию sayHello, которая содержит внутри себя команду console.log("Привет, мир!").</p>
43
function sayHello() { console.log("Привет, мир!"); }<p>Этот код создаёт функцию sayHello, которая содержит внутри себя команду console.log("Привет, мир!").</p>
44
<p>Способ называется function declaration. Он удобен тем, что функцию можно вызывать ещё до её объявления в коде.</p>
44
<p>Способ называется function declaration. Он удобен тем, что функцию можно вызывать ещё до её объявления в коде.</p>
45
<p>Создать функцию - только половина дела. Чтобы она сработала, её нужно вызвать. То есть сказать программе: "выполни вот это прямо сейчас".</p>
45
<p>Создать функцию - только половина дела. Чтобы она сработала, её нужно вызвать. То есть сказать программе: "выполни вот это прямо сейчас".</p>
46
<p>Для этого пишем имя функции и добавляем круглые скобки:</p>
46
<p>Для этого пишем имя функции и добавляем круглые скобки:</p>
47
sayHello();<p>В этот момент JavaScript находит функцию sayHello и запускает всё, что в ней написано. В нашем примере она выводит в консоль сообщение:</p>
47
sayHello();<p>В этот момент JavaScript находит функцию sayHello и запускает всё, что в ней написано. В нашем примере она выводит в консоль сообщение:</p>
48
Привет, мир!<p><strong>Запомните:</strong>если функцию не вызвать - она ничего не сделает. Она будет просто ждать своего часа в коде.</p>
48
Привет, мир!<p><strong>Запомните:</strong>если функцию не вызвать - она ничего не сделает. Она будет просто ждать своего часа в коде.</p>
49
<p>Часто бывает нужно, чтобы одна и та же функция работала с разными значениями. Например, вы пишете код для сайта интернет-магазина. Покупателю нужно показать приветствие: "Здравствуйте, [имя]". Имя у каждого пользователя своё, и передать его в функцию гораздо удобнее, чем писать для каждого посетителя свой блок кода.</p>
49
<p>Часто бывает нужно, чтобы одна и та же функция работала с разными значениями. Например, вы пишете код для сайта интернет-магазина. Покупателю нужно показать приветствие: "Здравствуйте, [имя]". Имя у каждого пользователя своё, и передать его в функцию гораздо удобнее, чем писать для каждого посетителя свой блок кода.</p>
50
<p>Для этого в функцию можно передавать данные. При её создании мы указываем параметры - это пустые места, в которые потом подставятся нужные значения. А при вызове передаём конкретные данные, которые функция и использует.</p>
50
<p>Для этого в функцию можно передавать данные. При её создании мы указываем параметры - это пустые места, в которые потом подставятся нужные значения. А при вызове передаём конкретные данные, которые функция и использует.</p>
51
function sayHelloName(name) { console.log("Привет, " + name + "!"); } sayHelloName("Андрей"); // "Привет, Андрей!" sayHelloName("Марина"); // "Привет, Марина!"<p>Здесь name - это параметр функции sayHelloName. При вызове функции мы передаём конкретное значение, которое подставляется вместо name. </p>
51
function sayHelloName(name) { console.log("Привет, " + name + "!"); } sayHelloName("Андрей"); // "Привет, Андрей!" sayHelloName("Марина"); // "Привет, Марина!"<p>Здесь name - это параметр функции sayHelloName. При вызове функции мы передаём конкретное значение, которое подставляется вместо name. </p>
52
<p>Можно передавать сразу несколько параметров. Указываем их через запятую:</p>
52
<p>Можно передавать сразу несколько параметров. Указываем их через запятую:</p>
53
function sayHelloFullname(name, surname) { console.log("Привет, " + name + " " + surname + "!"); } sayHelloFullname("Андрей", "Иванов"); // "Привет, Андрей Иванов!"<p>Не всегда получается передать все значения во время вызова функции. В таких случаях можно задать значение по умолчанию, тогда JavaScript сам подставит нужное значение.</p>
53
function sayHelloFullname(name, surname) { console.log("Привет, " + name + " " + surname + "!"); } sayHelloFullname("Андрей", "Иванов"); // "Привет, Андрей Иванов!"<p>Не всегда получается передать все значения во время вызова функции. В таких случаях можно задать значение по умолчанию, тогда JavaScript сам подставит нужное значение.</p>
54
function sayHelloName(name = "гость") { console.log("Привет, " + name + "!"); } sayHelloName(); // "Привет, гость!" sayHelloName("Катя"); // "Привет, Катя!"<p>Здесь, если функция sayHelloName вызывается без аргумента, параметр name принимает значение "гость". </p>
54
function sayHelloName(name = "гость") { console.log("Привет, " + name + "!"); } sayHelloName(); // "Привет, гость!" sayHelloName("Катя"); // "Привет, Катя!"<p>Здесь, если функция sayHelloName вызывается без аргумента, параметр name принимает значение "гость". </p>
55
<p>Значения по умолчанию могут быть не только строками или числами. Это может быть результат выражения или вызова другой функции. Можно, допустим, установить текущую дату и время в качестве значения по умолчанию.</p>
55
<p>Значения по умолчанию могут быть не только строками или числами. Это может быть результат выражения или вызова другой функции. Можно, допустим, установить текущую дату и время в качестве значения по умолчанию.</p>
56
function logEvent(message, timestamp = new Date().toISOString()) { console.log(`[${timestamp}] ${message}`); } logEvent("Неверный логин"); // [2025-02-22T12:34:56.789Z] Неверный логин logEvent("Ошибка подключения", "2025-01-01T00:00:00Z"); // [2025-01-01T00:00:00Z] Ошибка подключения<p>Иногда заранее не известно, сколько параметров передастся в функцию. Например, пользователь может выбрать один, два или десять элементов из списка - и все они должны попасть в функцию. В этом случае пригодится оператор ... (rest), который собирает все дополнительные аргументы в массив. Он записывается в виде трёх точек перед нужным параметром.</p>
56
function logEvent(message, timestamp = new Date().toISOString()) { console.log(`[${timestamp}] ${message}`); } logEvent("Неверный логин"); // [2025-02-22T12:34:56.789Z] Неверный логин logEvent("Ошибка подключения", "2025-01-01T00:00:00Z"); // [2025-01-01T00:00:00Z] Ошибка подключения<p>Иногда заранее не известно, сколько параметров передастся в функцию. Например, пользователь может выбрать один, два или десять элементов из списка - и все они должны попасть в функцию. В этом случае пригодится оператор ... (rest), который собирает все дополнительные аргументы в массив. Он записывается в виде трёх точек перед нужным параметром.</p>
57
function sayHelloManynames(...names) {; let fullName = names.join(" "); console.log(`Привет, ${fullName}!`); // Объединяет все имена в одну строку с пробелами } sayHelloManynames("Омар", "ибн", "аль-Хаттаб", "аль-Фарук"); // Привет, Омар абн аль-Хаттаб аль-Фарук!<p>Здесь ...names собирает все переданные аргументы в массив names, который затем объединяется в строку с помощью join(" ").</p>
57
function sayHelloManynames(...names) {; let fullName = names.join(" "); console.log(`Привет, ${fullName}!`); // Объединяет все имена в одну строку с пробелами } sayHelloManynames("Омар", "ибн", "аль-Хаттаб", "аль-Фарук"); // Привет, Омар абн аль-Хаттаб аль-Фарук!<p>Здесь ...names собирает все переданные аргументы в массив names, который затем объединяется в строку с помощью join(" ").</p>
58
<p>Функции в JavaScript могут не только выполнять действия, но и возвращать результат своей работы. Допустим, вы пишете калькулятор. Пользователь вводит два числа, а калькулятору нужно показать сумму. В этом случае удобно создать функцию sum(a, b), которая возвращает результат сложения. Вы передаёте ей значения и получаете ответ, с которым можно работать дальше - например, отобразить его на экране или использовать в других вычислениях.</p>
58
<p>Функции в JavaScript могут не только выполнять действия, но и возвращать результат своей работы. Допустим, вы пишете калькулятор. Пользователь вводит два числа, а калькулятору нужно показать сумму. В этом случае удобно создать функцию sum(a, b), которая возвращает результат сложения. Вы передаёте ей значения и получаете ответ, с которым можно работать дальше - например, отобразить его на экране или использовать в других вычислениях.</p>
59
<p>Для этого используется ключевое слово return. Оператор позволяет функции вернуть значение в то место, из которого она была вызвана. Это полезно, когда необходимо использовать результат вычислений функции в других частях программы.</p>
59
<p>Для этого используется ключевое слово return. Оператор позволяет функции вернуть значение в то место, из которого она была вызвана. Это полезно, когда необходимо использовать результат вычислений функции в других частях программы.</p>
60
function greet(name) { return "Привет, " + name + "!"; } const message = greet("Марина"); console.log(message); //Выведет: "Привет, Марина!"<p>Здесь:</p>
60
function greet(name) { return "Привет, " + name + "!"; } const message = greet("Марина"); console.log(message); //Выведет: "Привет, Марина!"<p>Здесь:</p>
61
<ul><li>JavaScript выполнит вызов функции greet(), передав ей строку "Марина";</li>
61
<ul><li>JavaScript выполнит вызов функции greet(), передав ей строку "Марина";</li>
62
<li>вернёт полученную строку "Привет, Марина!" и присвоит её переменной message;</li>
62
<li>вернёт полученную строку "Привет, Марина!" и присвоит её переменной message;</li>
63
<li>выведет message на печать.</li>
63
<li>выведет message на печать.</li>
64
</ul><p><strong>Важно:</strong>когда интерпретатор JavaScript встречает return, выполнение функции немедленно прекращается. Код после return внутри функции не будет выполнен. </p>
64
</ul><p><strong>Важно:</strong>когда интерпретатор JavaScript встречает return, выполнение функции немедленно прекращается. Код после return внутри функции не будет выполнен. </p>
65
function greet(name) { return "Привет, " + name + "!"; console.log("Это сообщение никогда не будет выведено."); }<p>Функция может возвращать любое значение:</p>
65
function greet(name) { return "Привет, " + name + "!"; console.log("Это сообщение никогда не будет выведено."); }<p>Функция может возвращать любое значение:</p>
66
<ul><li>строку или число;</li>
66
<ul><li>строку или число;</li>
67
<li>массив;</li>
67
<li>массив;</li>
68
<li>объект;</li>
68
<li>объект;</li>
69
<li>другую функцию.</li>
69
<li>другую функцию.</li>
70
</ul>function createUser(name, age) { return { name: name, age: age }; } console.log(createUser("Тимофей", 25)); // { name: "Тимофей", age: 25 }<p>Возврат значений часто используется, чтобы создавать структуру данных - например, карточку пользователя, заказ или товар.</p>
70
</ul>function createUser(name, age) { return { name: name, age: age }; } console.log(createUser("Тимофей", 25)); // { name: "Тимофей", age: 25 }<p>Возврат значений часто используется, чтобы создавать структуру данных - например, карточку пользователя, заказ или товар.</p>
71
<p>Бывают случаи, когда от функции не нужно никакого результата. Она просто что-то делает - например, выводит сообщение, запускает анимацию или меняет содержимое страницы.</p>
71
<p>Бывают случаи, когда от функции не нужно никакого результата. Она просто что-то делает - например, выводит сообщение, запускает анимацию или меняет содержимое страницы.</p>
72
<p>В таких функциях можно не использовать return. Они сработают, выполнят действия, и всё.</p>
72
<p>В таких функциях можно не использовать return. Они сработают, выполнят действия, и всё.</p>
73
function greet(name) { console.log("Привет, " + name + "!"); } const message = greet("Марина"); // Выведет: "Привет, Марина!" console.log(message); // Выведет: undefined<p>Что произойдёт:</p>
73
function greet(name) { console.log("Привет, " + name + "!"); } const message = greet("Марина"); // Выведет: "Привет, Марина!" console.log(message); // Выведет: undefined<p>Что произойдёт:</p>
74
<ul><li>в консоль выведется "Привет, Марина!";</li>
74
<ul><li>в консоль выведется "Привет, Марина!";</li>
75
<li>затем выведется undefined, потому что функция greet() ничего не вернула.</li>
75
<li>затем выведется undefined, потому что функция greet() ничего не вернула.</li>
76
</ul><p>Если в функции нет return, JavaScript автоматически возвращает undefined.</p>
76
</ul><p>Если в функции нет return, JavaScript автоматически возвращает undefined.</p>
77
<p>Чем отличается функция, возвращающая значение, от функции без return:</p>
77
<p>Чем отличается функция, возвращающая значение, от функции без return:</p>
78
<ul><li>Если функция использует return, она возвращает указанное значение.</li>
78
<ul><li>Если функция использует return, она возвращает указанное значение.</li>
79
<li>Если функция не использует return, она по умолчанию возвращает undefined.</li>
79
<li>Если функция не использует return, она по умолчанию возвращает undefined.</li>
80
</ul><p>В JavaScript область видимости (scope) - это правило, по которому переменные доступны в разных частях кода. Когда мы объявляем переменную, она "живёт" только в определённой зоне. И важно понимать, где именно она будет доступна.</p>
80
</ul><p>В JavaScript область видимости (scope) - это правило, по которому переменные доступны в разных частях кода. Когда мы объявляем переменную, она "живёт" только в определённой зоне. И важно понимать, где именно она будет доступна.</p>
81
<p>С функциями связаны две основные области видимости: глобальная и локальная.</p>
81
<p>С функциями связаны две основные области видимости: глобальная и локальная.</p>
82
<p>Если переменная создана вне функции, она глобальная. Такая переменная доступна в любом месте программы, в том числе внутри функций.</p>
82
<p>Если переменная создана вне функции, она глобальная. Такая переменная доступна в любом месте программы, в том числе внутри функций.</p>
83
const globalVar = "Я доступна везде!"; // Глобальная переменная function showVar() { console.log(globalVar); // Доступ к глобальной переменной внутри функции } showVar(); // "Я доступна везде!"<p><strong>Важно:</strong>глобальные переменные легко случайно изменить из разных частей программы. Это может привести к ошибкам, которые трудно отследить.</p>
83
const globalVar = "Я доступна везде!"; // Глобальная переменная function showVar() { console.log(globalVar); // Доступ к глобальной переменной внутри функции } showVar(); // "Я доступна везде!"<p><strong>Важно:</strong>глобальные переменные легко случайно изменить из разных частей программы. Это может привести к ошибкам, которые трудно отследить.</p>
84
<p>Если переменная объявлена внутри функции, она локальная. То есть доступна только в этой функции и нигде больше.</p>
84
<p>Если переменная объявлена внутри функции, она локальная. То есть доступна только в этой функции и нигде больше.</p>
85
function showVar() { let localVar = "Я доступна в функции!"; console.log(localVar); // Доступна внутри функции } showVar(); // "Я доступна в функции!" console.log(localVar); // Ошибка! localVar не определена за пределами функции<p>Почему так: переменная localVar существует только внутри функции showVar. За её пределами она не видна и не может быть использована.</p>
85
function showVar() { let localVar = "Я доступна в функции!"; console.log(localVar); // Доступна внутри функции } showVar(); // "Я доступна в функции!" console.log(localVar); // Ошибка! localVar не определена за пределами функции<p>Почему так: переменная localVar существует только внутри функции showVar. За её пределами она не видна и не может быть использована.</p>
86
<p><strong>Важно:</strong>локальные переменные защищены от изменений извне. Это делает код более предсказуемым и безопасным.</p>
86
<p><strong>Важно:</strong>локальные переменные защищены от изменений извне. Это делает код более предсказуемым и безопасным.</p>
87
<p>В JavaScript функция может "запоминать" переменные из того места, где она была создана. Даже если вызвать её позже, в другом месте, - она всё равно будет помнить эти значения.</p>
87
<p>В JavaScript функция может "запоминать" переменные из того места, где она была создана. Даже если вызвать её позже, в другом месте, - она всё равно будет помнить эти значения.</p>
88
<p>Когда одна функция создаётся внутри другой, внутренняя функция сохраняет доступ ко всем переменным, которые были в момент её создания. Даже если внешняя функция уже завершила работу, эти переменные остаются доступны.</p>
88
<p>Когда одна функция создаётся внутри другой, внутренняя функция сохраняет доступ ко всем переменным, которые были в момент её создания. Даже если внешняя функция уже завершила работу, эти переменные остаются доступны.</p>
89
<p>Представьте, что внутренняя функция как будто кладёт переменные в невидимый "рюкзак" и носит с собой:</p>
89
<p>Представьте, что внутренняя функция как будто кладёт переменные в невидимый "рюкзак" и носит с собой:</p>
90
function createCounter() { let count = 0; // Переменная из внешней области видимости return function() { count++; console.log("Текущее значение:", count); }; // Внутренняя функция, имеющая доступ к count } const counter = createCounter(); // Создаём функцию-счётчик counter(); // Текущее значение: 1 counter(); // Текущее значение: 2 counter(); // Текущее значение: 3<p>Здесь:</p>
90
function createCounter() { let count = 0; // Переменная из внешней области видимости return function() { count++; console.log("Текущее значение:", count); }; // Внутренняя функция, имеющая доступ к count } const counter = createCounter(); // Создаём функцию-счётчик counter(); // Текущее значение: 1 counter(); // Текущее значение: 2 counter(); // Текущее значение: 3<p>Здесь:</p>
91
<ul><li>createCounter() создаёт переменную count и возвращает функцию;</li>
91
<ul><li>createCounter() создаёт переменную count и возвращает функцию;</li>
92
<li>эта функция увеличивает count и выводит его значение;</li>
92
<li>эта функция увеличивает count и выводит его значение;</li>
93
<li>даже после завершения createCounter() переменная count не исчезает, - она "живёт" внутри замыкания.</li>
93
<li>даже после завершения createCounter() переменная count не исчезает, - она "живёт" внутри замыкания.</li>
94
</ul><p>Это и есть замыкание: внутренняя функция "помнит" переменную count, потому что была создана в той же области видимости.</p>
94
</ul><p>Это и есть замыкание: внутренняя функция "помнит" переменную count, потому что была создана в той же области видимости.</p>
95
<p>Замыкания удобны, когда нужно, чтобы функция помнила информацию между вызовами. Это может быть полезно в разных ситуациях:</p>
95
<p>Замыкания удобны, когда нужно, чтобы функция помнила информацию между вызовами. Это может быть полезно в разных ситуациях:</p>
96
<ul><li>вы создаёте счётчик, который увеличивается каждый раз, когда вызывается функция;</li>
96
<ul><li>вы создаёте счётчик, который увеличивается каждый раз, когда вызывается функция;</li>
97
<li>пишете обработчик событий, которому нужно помнить, что было раньше;</li>
97
<li>пишете обработчик событий, которому нужно помнить, что было раньше;</li>
98
<li>хотите сгенерировать уникальные ID и не повторяться;</li>
98
<li>хотите сгенерировать уникальные ID и не повторяться;</li>
99
<li>хотите спрятать данные от внешнего доступа и не дать другим частям программы их менять.</li>
99
<li>хотите спрятать данные от внешнего доступа и не дать другим частям программы их менять.</li>
100
</ul><p>Во всех этих случаях замыкание помогает сохранить переменные внутри функции, не делая их глобальными.</p>
100
</ul><p>Во всех этих случаях замыкание помогает сохранить переменные внутри функции, не делая их глобальными.</p>
101
<p>В JavaScript есть два основных способа создать функцию:</p>
101
<p>В JavaScript есть два основных способа создать функцию:</p>
102
<ul><li>через function declaration - привычное объявление с ключевым словом function;</li>
102
<ul><li>через function declaration - привычное объявление с ключевым словом function;</li>
103
<li>Через function expression - функция создаётся внутри выражения и сохраняется в переменную.</li>
103
<li>Через function expression - функция создаётся внутри выражения и сохраняется в переменную.</li>
104
</ul><p>Пример:</p>
104
</ul><p>Пример:</p>
105
const greet = function () { console.log("Привет!"); }; greet();<p>Такую функцию нельзя вызвать до её создания, потому что переменная, в которую она записана, появляется только в момент выполнения.</p>
105
const greet = function () { console.log("Привет!"); }; greet();<p>Такую функцию нельзя вызвать до её создания, потому что переменная, в которую она записана, появляется только в момент выполнения.</p>
106
<p>Когда это бывает полезно</p>
106
<p>Когда это бывает полезно</p>
107
<p>Допустим, у нас есть условие: если пользователю меньше 18 - одно сообщение, если больше - другое. Мы хотим выбрать подходящую функцию в зависимости от возраста.</p>
107
<p>Допустим, у нас есть условие: если пользователю меньше 18 - одно сообщение, если больше - другое. Мы хотим выбрать подходящую функцию в зависимости от возраста.</p>
108
const age = Number(prompt("Сколько вам лет?")); // Выводит диалоговое окно с вопросом let greet; // Объявляем переменную greet, которой затем присвоим значение функции if (age < 18) { greet = function() { alert("Привет!"); }; } else { greet = function() { alert("Здравствуйте!"); }; } greet();<p>Здесь:</p>
108
const age = Number(prompt("Сколько вам лет?")); // Выводит диалоговое окно с вопросом let greet; // Объявляем переменную greet, которой затем присвоим значение функции if (age < 18) { greet = function() { alert("Привет!"); }; } else { greet = function() { alert("Здравствуйте!"); }; } greet();<p>Здесь:</p>
109
<ul><li>мы запрашиваем возраст с помощью prompt();</li>
109
<ul><li>мы запрашиваем возраст с помощью prompt();</li>
110
<li>определяем функцию greet() в зависимости от значения age;</li>
110
<li>определяем функцию greet() в зависимости от значения age;</li>
111
<li>вызываем greet(), и пользователь получает соответствующее приветствие.</li>
111
<li>вызываем greet(), и пользователь получает соответствующее приветствие.</li>
112
</ul><p><strong>Важно:</strong>пример с prompt() и alert() работает только в браузере. В среде Node.js такие функции не поддерживаются.</p>
112
</ul><p><strong>Важно:</strong>пример с prompt() и alert() работает только в браузере. В среде Node.js такие функции не поддерживаются.</p>
113
<p>Если попробовать создать функцию обычным способом - function greet() { ... } - прямо внутри if, могут возникнуть проблемы.</p>
113
<p>Если попробовать создать функцию обычным способом - function greet() { ... } - прямо внутри if, могут возникнуть проблемы.</p>
114
<p>В JS есть директива use strict, которая включает строгий режим. Он делает код более безопасным: запрещает некоторые устаревшие конструкции и помогает сразу замечать ошибки.</p>
114
<p>В JS есть директива use strict, которая включает строгий режим. Он делает код более безопасным: запрещает некоторые устаревшие конструкции и помогает сразу замечать ошибки.</p>
115
<p>В строгом режиме такая функция будет существовать только внутри блока if. За пределами блока она будет недоступна - и, если вы попытаетесь её вызвать снаружи, получите ошибку.</p>
115
<p>В строгом режиме такая функция будет существовать только внутри блока if. За пределами блока она будет недоступна - и, если вы попытаетесь её вызвать снаружи, получите ошибку.</p>
116
<p>Function expression - это способ избежать этой ошибки. Мы сначала создаём переменную, например greet, а потом в нужный момент записываем в неё нужную функцию. Так код работает надёжно и предсказуемо - вне зависимости от условий.</p>
116
<p>Function expression - это способ избежать этой ошибки. Мы сначала создаём переменную, например greet, а потом в нужный момент записываем в неё нужную функцию. Так код работает надёжно и предсказуемо - вне зависимости от условий.</p>
117
<p>Стрелочные функции - это короткий способ записать функцию. Их добавили в JavaScript в 2015 году (ES6).</p>
117
<p>Стрелочные функции - это короткий способ записать функцию. Их добавили в JavaScript в 2015 году (ES6).</p>
118
<p>Главное отличие - вместо function используется стрелка =>. Ещё одна особенность: если внутри функции всего одна строка, можно не писать фигурные скобки и return - JavaScript поймёт всё сам.</p>
118
<p>Главное отличие - вместо function используется стрелка =>. Ещё одна особенность: если внутри функции всего одна строка, можно не писать фигурные скобки и return - JavaScript поймёт всё сам.</p>
119
<p>Пример:</p>
119
<p>Пример:</p>
120
const greet = (name) => `Привет, ${name}!`; console.log(greet("Анна")); // Выведет: "Привет, Анна!"<p>Почему это удобно:</p>
120
const greet = (name) => `Привет, ${name}!`; console.log(greet("Анна")); // Выведет: "Привет, Анна!"<p>Почему это удобно:</p>
121
<ul><li>Меньше кода. Особенно для коротких функций, которые делают что-то одно.</li>
121
<ul><li>Меньше кода. Особенно для коротких функций, которые делают что-то одно.</li>
122
<li>Проще читать. Нет function, нет лишних скобок, - всё ясно с первого взгляда.</li>
122
<li>Проще читать. Нет function, нет лишних скобок, - всё ясно с первого взгляда.</li>
123
<li>this работает иначе. В стрелочных функциях this не меняется. Это удобно, когда нужно сохранить контекст из внешней области.</li>
123
<li>this работает иначе. В стрелочных функциях this не меняется. Это удобно, когда нужно сохранить контекст из внешней области.</li>
124
</ul><p>Когда JavaScript начинает выполнять код, он создаёт для этого специальную "рабочую зону". Эта зона называется контекстом выполнения (или просто контекстом). Она помогает понять, где сейчас выполняется код и какие переменные и объекты доступны.</p>
124
</ul><p>Когда JavaScript начинает выполнять код, он создаёт для этого специальную "рабочую зону". Эта зона называется контекстом выполнения (или просто контекстом). Она помогает понять, где сейчас выполняется код и какие переменные и объекты доступны.</p>
125
<p>У каждого контекста есть три важные части:</p>
125
<p>У каждого контекста есть три важные части:</p>
126
<ul><li><strong>Область видимости </strong>- показывает, какие переменные и функции доступны в данный момент.</li>
126
<ul><li><strong>Область видимости </strong>- показывает, какие переменные и функции доступны в данный момент.</li>
127
<li>this - указывает на объект, к которому привязана текущая функция.</li>
127
<li>this - указывает на объект, к которому привязана текущая функция.</li>
128
<li><strong>Стек вызовов (call stack)</strong> - как стопка тарелок: JavaScript складывает туда функции, когда они вызываются, и убирает обратно, когда они завершаются.</li>
128
<li><strong>Стек вызовов (call stack)</strong> - как стопка тарелок: JavaScript складывает туда функции, когда они вызываются, и убирает обратно, когда они завершаются.</li>
129
</ul><p><strong>1. Глобальный контекст.</strong>Когда страница загружается (или скрипт запускается), создаётся глобальный контекст. В браузере это объект window, в Node.js - global.Все переменные и функции, созданные вне других блоков, становятся частью этого объекта.</p>
129
</ul><p><strong>1. Глобальный контекст.</strong>Когда страница загружается (или скрипт запускается), создаётся глобальный контекст. В браузере это объект window, в Node.js - global.Все переменные и функции, созданные вне других блоков, становятся частью этого объекта.</p>
130
console.log(this); // В браузере: window<p><strong>2. Контекст функции.</strong>Каждый раз, когда вызывается функция, создаётся новый контекст. Внутри него есть свои переменные, аргументы и значение this.</p>
130
console.log(this); // В браузере: window<p><strong>2. Контекст функции.</strong>Каждый раз, когда вызывается функция, создаётся новый контекст. Внутри него есть свои переменные, аргументы и значение this.</p>
131
function greet() { console.log(this); // В обычной функции this зависит от способа вызова } greet();<p>Если вызвать greet() просто так, this укажет на window (в нестрогом режиме).</p>
131
function greet() { console.log(this); // В обычной функции this зависит от способа вызова } greet();<p>Если вызвать greet() просто так, this укажет на window (в нестрогом режиме).</p>
132
<p><strong>3. Контекст объекта</strong>(this). Когда функция вызывается как метод объекта, this ссылается на этот объект.</p>
132
<p><strong>3. Контекст объекта</strong>(this). Когда функция вызывается как метод объекта, this ссылается на этот объект.</p>
133
const user = { name: "Андрей", greet() { console.log(`Привет, ${this.name}`); } }; user.greet(); // Привет, Андрей<p>Здесь this ссылается на объект user, поэтому мы получаем имя пользователя.</p>
133
const user = { name: "Андрей", greet() { console.log(`Привет, ${this.name}`); } }; user.greet(); // Привет, Андрей<p>Здесь this ссылается на объект user, поэтому мы получаем имя пользователя.</p>
134
<p>Есть и другие контексты: у конструкторов, стрелочных функций и обработчиков событий. У каждого есть особенности, о которых мы расскажем в разделах справочника, посвящённых этим темам.</p>
134
<p>Есть и другие контексты: у конструкторов, стрелочных функций и обработчиков событий. У каждого есть особенности, о которых мы расскажем в разделах справочника, посвящённых этим темам.</p>
135
<p>Когда JavaScript вызывает функцию, он кладёт её в стек вызовов - список, в котором отслеживается порядок выполнения. Это работает по принципу LIFO (last in, first out): последним пришёл, первым ушёл.</p>
135
<p>Когда JavaScript вызывает функцию, он кладёт её в стек вызовов - список, в котором отслеживается порядок выполнения. Это работает по принципу LIFO (last in, first out): последним пришёл, первым ушёл.</p>
136
<p>Рассмотрим на примере двух вложенных функций.</p>
136
<p>Рассмотрим на примере двух вложенных функций.</p>
137
function first() { second(); } function second() { console.log("Привет из второй функции!"); } first();<p>Как меняется стек вызовов поэтапно:</p>
137
function first() { second(); } function second() { console.log("Привет из второй функции!"); } first();<p>Как меняется стек вызовов поэтапно:</p>
138
<ul><li>JavaScript начинает выполнение - стек пуст.</li>
138
<ul><li>JavaScript начинает выполнение - стек пуст.</li>
139
<li>Вызов first(). Функция first() добавляется в стек.</li>
139
<li>Вызов first(). Функция first() добавляется в стек.</li>
140
<li>Внутри first() вызывается second(). second() добавляется в стек поверх first().</li>
140
<li>Внутри first() вызывается second(). second() добавляется в стек поверх first().</li>
141
<li>second() выполняет console.log. Вызов console.log() попадает в стек.</li>
141
<li>second() выполняет console.log. Вызов console.log() попадает в стек.</li>
142
<li>console.log() завершился. После вывода в консоль, console.log() убирается из стека.</li>
142
<li>console.log() завершился. После вывода в консоль, console.log() убирается из стека.</li>
143
<li>second() завершилась, - она убирается из стека.</li>
143
<li>second() завершилась, - она убирается из стека.</li>
144
<li>first() завершилась, стек пуст.</li>
144
<li>first() завершилась, стек пуст.</li>
145
</ul><p>Одна из распространённых ошибок при работе с функциями - забыть или неправильно использовать return.</p>
145
</ul><p>Одна из распространённых ошибок при работе с функциями - забыть или неправильно использовать return.</p>
146
<p><strong>return</strong><strong>на новой строке без</strong><strong>()</strong></p>
146
<p><strong>return</strong><strong>на новой строке без</strong><strong>()</strong></p>
147
function getNumber() { return 42; // return завершает выполнение, и эта строка не выполнится! } console.log(getNumber()); // undefined<p><strong>Почему так происходит:</strong>JavaScript думает, что return уже завершил функцию. А 42 он просто игнорирует.</p>
147
function getNumber() { return 42; // return завершает выполнение, и эта строка не выполнится! } console.log(getNumber()); // undefined<p><strong>Почему так происходит:</strong>JavaScript думает, что return уже завершил функцию. А 42 он просто игнорирует.</p>
148
<p><strong>Правильный вариант:</strong></p>
148
<p><strong>Правильный вариант:</strong></p>
149
function getNumber() { return 42; // Возвращаем число правильно }<p>Если всё же хочется перенести число на новую строку, оберните его скобками:</p>
149
function getNumber() { return 42; // Возвращаем число правильно }<p>Если всё же хочется перенести число на новую строку, оберните его скобками:</p>
150
function getNumber() { return ( 42 ); } console.log(getNumber()); // 42<p><strong>Нет return в некоторых ветках кода</strong></p>
150
function getNumber() { return ( 42 ); } console.log(getNumber()); // 42<p><strong>Нет return в некоторых ветках кода</strong></p>
151
function checkAge(age) { if (age >= 18) { return "Доступ разрешён"; } // Здесь нет return! } console.log(checkAge(20)); // "Доступ разрешён" console.log(checkAge(15)); // undefined (ожидали строку, но её нет)<p><strong>Почему так:</strong>если age < 18, функция<strong>ничего не возвращает</strong>, и результат undefined.</p>
151
function checkAge(age) { if (age >= 18) { return "Доступ разрешён"; } // Здесь нет return! } console.log(checkAge(20)); // "Доступ разрешён" console.log(checkAge(15)); // undefined (ожидали строку, но её нет)<p><strong>Почему так:</strong>если age < 18, функция<strong>ничего не возвращает</strong>, и результат undefined.</p>
152
<p><strong>Правильный вариант:</strong></p>
152
<p><strong>Правильный вариант:</strong></p>
153
function checkAge(age) { if (age >= 18) { return "Доступ разрешён"; } return "Доступ запрещён"; // Теперь всегда есть return } console.log(checkAge(15)); // "Доступ запрещён"<p><strong>Рекурсивная функция без выхода</strong></p>
153
function checkAge(age) { if (age >= 18) { return "Доступ разрешён"; } return "Доступ запрещён"; // Теперь всегда есть return } console.log(checkAge(15)); // "Доступ запрещён"<p><strong>Рекурсивная функция без выхода</strong></p>
154
function countdown(n) { console.log(n); countdown(n - 1); // Функция вызывает саму себя без остановки! } countdown(5);<p><strong>Что произойдёт:</strong></p>
154
function countdown(n) { console.log(n); countdown(n - 1); // Функция вызывает саму себя без остановки! } countdown(5);<p><strong>Что произойдёт:</strong></p>
155
<ul><li>Функция countdown будет бесконечно уменьшать n.</li>
155
<ul><li>Функция countdown будет бесконечно уменьшать n.</li>
156
<li>Когда n станет отрицательным, вызовы продолжатся.</li>
156
<li>Когда n станет отрицательным, вызовы продолжатся.</li>
157
<li>В итоге JavaScript выдаст "Maximum call stack size exceeded" (переполнение стека).</li>
157
<li>В итоге JavaScript выдаст "Maximum call stack size exceeded" (переполнение стека).</li>
158
</ul><p>Чтобы всё исправить, надо добавить условие выхода.</p>
158
</ul><p>Чтобы всё исправить, надо добавить условие выхода.</p>
159
<p><strong>Правильный вариант:</strong></p>
159
<p><strong>Правильный вариант:</strong></p>
160
function countdown(n) { if (n <= 0) { // Условие выхода console.log("Стоп!"); return; } console.log(n); countdown(n - 1); } countdown(5); // Выдаст 5 ... 4 ... 3 ... 2 ... 1 и остановится<p><strong>null вместо undefined при значении по умолчанию</strong></p>
160
function countdown(n) { if (n <= 0) { // Условие выхода console.log("Стоп!"); return; } console.log(n); countdown(n - 1); } countdown(5); // Выдаст 5 ... 4 ... 3 ... 2 ... 1 и остановится<p><strong>null вместо undefined при значении по умолчанию</strong></p>
161
function greet(name = "Гость") { console.log(`Привет, ${name}!`); } greet(null); // "Привет, null!"<p><strong>Почему так:</strong>в функции задано значение по умолчанию ("Гость"), и мы хотим его использовать. Значения по умолчанию срабатывают, только если аргумент не определён (undefined). В JavaScript null и undefined часто используются как "отсутствие значения", но они не идентичны. Иногда разработчики явно задают null, думая, что это undefined.</p>
161
function greet(name = "Гость") { console.log(`Привет, ${name}!`); } greet(null); // "Привет, null!"<p><strong>Почему так:</strong>в функции задано значение по умолчанию ("Гость"), и мы хотим его использовать. Значения по умолчанию срабатывают, только если аргумент не определён (undefined). В JavaScript null и undefined часто используются как "отсутствие значения", но они не идентичны. Иногда разработчики явно задают null, думая, что это undefined.</p>
162
<p><strong>Правильный вариант:</strong></p>
162
<p><strong>Правильный вариант:</strong></p>
163
function greet(name = "Гость") { console.log(`Привет, ${name}!`); } greet(); // "Привет, Гость!" greet(undefined); // "Привет, Гость!"<p><strong>Используйте понятные имена.</strong></p>
163
function greet(name = "Гость") { console.log(`Привет, ${name}!`); } greet(); // "Привет, Гость!" greet(undefined); // "Привет, Гость!"<p><strong>Используйте понятные имена.</strong></p>
164
<ul><li>Давайте функциям ясные и осмысленные названия, чтобы код было легче читать и понимать.</li>
164
<ul><li>Давайте функциям ясные и осмысленные названия, чтобы код было легче читать и понимать.</li>
165
<li>Вместо неопределённого ct лучше использовать calculateTotal.</li>
165
<li>Вместо неопределённого ct лучше использовать calculateTotal.</li>
166
</ul><p><strong>Пишите короткие и лаконичные функции.</strong></p>
166
</ul><p><strong>Пишите короткие и лаконичные функции.</strong></p>
167
<ul><li>Одна функция должна выполнять<strong>одну конкретную задачу.</strong></li>
167
<ul><li>Одна функция должна выполнять<strong>одну конкретную задачу.</strong></li>
168
<li>Если код слишком разрастается, разбейте его на несколько функций.</li>
168
<li>Если код слишком разрастается, разбейте его на несколько функций.</li>
169
</ul><p><strong>Используйте</strong><strong>const</strong><strong>и</strong> <strong>let</strong><strong>вместо</strong><strong>var</strong><strong>.</strong></p>
169
</ul><p><strong>Используйте</strong><strong>const</strong><strong>и</strong> <strong>let</strong><strong>вместо</strong><strong>var</strong><strong>.</strong></p>
170
<ul><li>const для неизменяемых переменных, let для изменяемых.</li>
170
<ul><li>const для неизменяемых переменных, let для изменяемых.</li>
171
<li>Это улучшает читаемость и снижает вероятность ошибок.</li>
171
<li>Это улучшает читаемость и снижает вероятность ошибок.</li>
172
</ul><p><strong>Не изменяйте переданные аргументы.</strong></p>
172
</ul><p><strong>Не изменяйте переданные аргументы.</strong></p>
173
<ul><li>Функция не должна менять входные данные, если это не её основная цель.</li>
173
<ul><li>Функция не должна менять входные данные, если это не её основная цель.</li>
174
<li>При необходимости возвращайте новый результат.</li>
174
<li>При необходимости возвращайте новый результат.</li>
175
</ul><p><strong>Используйте параметры по умолчанию.</strong></p>
175
</ul><p><strong>Используйте параметры по умолчанию.</strong></p>
176
<ul><li>Позволяет избежать ошибок, если аргумент не передан.</li>
176
<ul><li>Позволяет избежать ошибок, если аргумент не передан.</li>
177
</ul><p>Напишите функцию, которая принимает массив целых чисел и возвращает сумму всех чисел, кратных 3.</p>
177
</ul><p>Напишите функцию, которая принимает массив целых чисел и возвращает сумму всех чисел, кратных 3.</p>
178
<p>Решение:</p>
178
<p>Решение:</p>
179
function sumMultipleOfThree(arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { if (arr[i] % 3 === 0) { sum += arr[i]; } } return sum; }<p>Напишите функцию, которая определяет, является ли переданная строка палиндромом. Палиндромом считается строка, которая читается одинаково как слева направо, так и справа налево.</p>
179
function sumMultipleOfThree(arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { if (arr[i] % 3 === 0) { sum += arr[i]; } } return sum; }<p>Напишите функцию, которая определяет, является ли переданная строка палиндромом. Палиндромом считается строка, которая читается одинаково как слева направо, так и справа налево.</p>
180
<p>Решение:</p>
180
<p>Решение:</p>
181
function isPalindrome(str) { const reversedStr = str.split('').reverse().join(''); return str === reversedStr; } // Примеры использования: console.log(isPalindrome('level')); ``// Вернёт true console.log(isPalindrome('hello')); ``// Вернёт false<p>Здесь:</p>
181
function isPalindrome(str) { const reversedStr = str.split('').reverse().join(''); return str === reversedStr; } // Примеры использования: console.log(isPalindrome('level')); ``// Вернёт true console.log(isPalindrome('hello')); ``// Вернёт false<p>Здесь:</p>
182
<ul><li>str.split('') - превращает строку в массив символов (например, 'hello' → ['h', 'e', 'l', 'l', 'o'])</li>
182
<ul><li>str.split('') - превращает строку в массив символов (например, 'hello' → ['h', 'e', 'l', 'l', 'o'])</li>
183
<li>reverse() - переворачивает массив ( ['h', 'e', 'l', 'l', 'o'] → ['o', 'l', 'l', 'e', 'h'])</li>
183
<li>reverse() - переворачивает массив ( ['h', 'e', 'l', 'l', 'o'] → ['o', 'l', 'l', 'e', 'h'])</li>
184
<li>join('') - собирает массив обратно в строку ( ['o', 'l', 'l', 'e', 'h'] → 'olleh')</li>
184
<li>join('') - собирает массив обратно в строку ( ['o', 'l', 'l', 'e', 'h'] → 'olleh')</li>
185
</ul><p>Сравниваем оригинал и перевёрнутую строку: return str === reversedStr;</p>
185
</ul><p>Сравниваем оригинал и перевёрнутую строку: return str === reversedStr;</p>
186
<p>Напишите функцию, которая возвращает случайное сообщение из заранее заданного списка.</p>
186
<p>Напишите функцию, которая возвращает случайное сообщение из заранее заданного списка.</p>
187
<p>Список сообщений:</p>
187
<p>Список сообщений:</p>
188
<ul><li>"Ты молодец!"</li>
188
<ul><li>"Ты молодец!"</li>
189
<li>"Продолжай в том же духе!</li>
189
<li>"Продолжай в том же духе!</li>
190
<li>"Отличная работа!"</li>
190
<li>"Отличная работа!"</li>
191
<li>"Ты на верном пути!"</li>
191
<li>"Ты на верном пути!"</li>
192
</ul><p>Решение:</p>
192
</ul><p>Решение:</p>
193
function generateRandomMessage() { const messages = [ "Ты молодец!", "Продолжай в том же духе!", "Отличная работа!", "Ты на верном пути!" ]; const index = Math.floor(Math.random() * messages.length); // Выбор случайного индекса из массива return messages[index]; // Возврат выбранного сообщения } console.log(generateRandomMessage());<p><strong>Здесь:</strong></p>
193
function generateRandomMessage() { const messages = [ "Ты молодец!", "Продолжай в том же духе!", "Отличная работа!", "Ты на верном пути!" ]; const index = Math.floor(Math.random() * messages.length); // Выбор случайного индекса из массива return messages[index]; // Возврат выбранного сообщения } console.log(generateRandomMessage());<p><strong>Здесь:</strong></p>
194
<ul><li>Math.random() → генерирует случайное число от 0 до 1 (например, 0.72).</li>
194
<ul><li>Math.random() → генерирует случайное число от 0 до 1 (например, 0.72).</li>
195
<li>Умножаем это число на messages.length (количество элементов в заданном списке, в данном случае 4).</li>
195
<li>Умножаем это число на messages.length (количество элементов в заданном списке, в данном случае 4).</li>
196
<li>Math.floor(...) округляет вниз до целого числа от 0 до 3 - это и есть случайный индекс массива.</li>
196
<li>Math.floor(...) округляет вниз до целого числа от 0 до 3 - это и есть случайный индекс массива.</li>
197
<li>return messages[index] - возвращается сообщение, определённое по индексу.</li>
197
<li>return messages[index] - возвращается сообщение, определённое по индексу.</li>
198
</ul><a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>
198
</ul><a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>