HTML Diff
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 &lt; 18) { greet = function() { alert("Привет!"); }; } else { greet = function() { alert("Здравствуйте!"); }; } greet();<p>Здесь:</p>
108 const age = Number(prompt("Сколько вам лет?")); // Выводит диалоговое окно с вопросом let greet; // Объявляем переменную greet, которой затем присвоим значение функции if (age &lt; 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 используется стрелка =&gt;. Ещё одна особенность: если внутри функции всего одна строка, можно не писать фигурные скобки и return - JavaScript поймёт всё сам.</p>
118 <p>Главное отличие - вместо function используется стрелка =&gt;. Ещё одна особенность: если внутри функции всего одна строка, можно не писать фигурные скобки и return - JavaScript поймёт всё сам.</p>
119 <p>Пример:</p>
119 <p>Пример:</p>
120 const greet = (name) =&gt; `Привет, ${name}!`; console.log(greet("Анна")); // Выведет: "Привет, Анна!"<p>Почему это удобно:</p>
120 const greet = (name) =&gt; `Привет, ${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 &gt;= 18) { return "Доступ разрешён"; } // Здесь нет return! } console.log(checkAge(20)); // "Доступ разрешён" console.log(checkAge(15)); // undefined (ожидали строку, но её нет)<p><strong>Почему так:</strong>если age &lt; 18, функция<strong>ничего не возвращает</strong>, и результат undefined.</p>
151 function checkAge(age) { if (age &gt;= 18) { return "Доступ разрешён"; } // Здесь нет return! } console.log(checkAge(20)); // "Доступ разрешён" console.log(checkAge(15)); // undefined (ожидали строку, но её нет)<p><strong>Почему так:</strong>если age &lt; 18, функция<strong>ничего не возвращает</strong>, и результат undefined.</p>
152 <p><strong>Правильный вариант:</strong></p>
152 <p><strong>Правильный вариант:</strong></p>
153 function checkAge(age) { if (age &gt;= 18) { return "Доступ разрешён"; } return "Доступ запрещён"; // Теперь всегда есть return } console.log(checkAge(15)); // "Доступ запрещён"<p><strong>Рекурсивная функция без выхода</strong></p>
153 function checkAge(age) { if (age &gt;= 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 &lt;= 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 &lt;= 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 &lt; 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 &lt; 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>