1 added
1 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>24 апр 2025</li>
2
<ul><li>24 апр 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Как пишутся, где применяются и чем отличаются от обычных функций.</p>
4
</ul><p>Как пишутся, где применяются и чем отличаются от обычных функций.</p>
5
-
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
5
+
<p>Иллюстрация: Polina Vari дл�� Skillbox Media</p>
6
<p>Автор статей о программировании. Изучает Python, разбирает сложные термины и объясняет их на пальцах новичкам. Если что-то непонятно - возможно, вы ещё не прочли его следующую публикацию.</p>
6
<p>Автор статей о программировании. Изучает Python, разбирает сложные термины и объясняет их на пальцах новичкам. Если что-то непонятно - возможно, вы ещё не прочли его следующую публикацию.</p>
7
<p>В JavaScript программисты часто работают с функциями - блоками кода, которые можно многократно использовать для различных задач. Это как записать рецепт, а затем снова и снова готовить по нему любимое блюдо.</p>
7
<p>В JavaScript программисты часто работают с функциями - блоками кода, которые можно многократно использовать для различных задач. Это как записать рецепт, а затем снова и снова готовить по нему любимое блюдо.</p>
8
<p>До 2015 года функции создавали с помощью ключевого слова function. С выходом стандарта ES6 в JavaScript появился альтернативный синтаксис - arrow function, стрелочные функции. Разберёмся, как они устроены и когда их удобно использовать.</p>
8
<p>До 2015 года функции создавали с помощью ключевого слова function. С выходом стандарта ES6 в JavaScript появился альтернативный синтаксис - arrow function, стрелочные функции. Разберёмся, как они устроены и когда их удобно использовать.</p>
9
<p><strong>Содержание</strong></p>
9
<p><strong>Содержание</strong></p>
10
<ul><li><a>Базовый синтаксис</a></li>
10
<ul><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
</ul><ul><li><a>Краткая запись с неявным возвратом</a></li>
14
</ul><ul><li><a>Краткая запись с неявным возвратом</a></li>
15
<li><a>Запись с одним параметром</a></li>
15
<li><a>Запись с одним параметром</a></li>
16
<li><a>Запись без параметров</a></li>
16
<li><a>Запись без параметров</a></li>
17
<li><a>Многострочная запись с явным возвратом</a></li>
17
<li><a>Многострочная запись с явным возвратом</a></li>
18
<li><a>Запись с параметрами по умолчанию</a></li>
18
<li><a>Запись с параметрами по умолчанию</a></li>
19
<li><a>Запись с rest-параметром</a></li>
19
<li><a>Запись с rest-параметром</a></li>
20
</ul><ul><li><a>Область видимости и контекст this</a></li>
20
</ul><ul><li><a>Область видимости и контекст this</a></li>
21
<li><a>Сценарии применения</a></li>
21
<li><a>Сценарии применения</a></li>
22
<li><a>Типичные ошибки</a></li>
22
<li><a>Типичные ошибки</a></li>
23
<li><a>Практические задания</a></li>
23
<li><a>Практические задания</a></li>
24
</ul><ul><li><a>Исправьте ошибку с возвратом значения</a></li>
24
</ul><ul><li><a>Исправьте ошибку с возвратом значения</a></li>
25
<li><a>Перепишите функцию с rest-параметром</a></li>
25
<li><a>Перепишите функцию с rest-параметром</a></li>
26
<li><a>Посчитайте количество чашек кофе</a></li>
26
<li><a>Посчитайте количество чашек кофе</a></li>
27
</ul><p>У стрелочной функции нет собственного имени, и она записывается так:</p>
27
</ul><p>У стрелочной функции нет собственного имени, и она записывается так:</p>
28
(parameter1, parameter2) => { return result; };<p>(parameter1, parameter2) - входные данные (параметры), которые функция получает для обработки. Это могут быть числа, строки и другие значения. Функция может принимать один, несколько или ни одного параметра.</p>
28
(parameter1, parameter2) => { return result; };<p>(parameter1, parameter2) - входные данные (параметры), которые функция получает для обработки. Это могут быть числа, строки и другие значения. Функция может принимать один, несколько или ни одного параметра.</p>
29
<p>После параметров идёт символ стрелки =>. Он заменяет ключевое слово function, которое используется в обычных функциях. Стрелка визуально отделяет параметры от тела функции и делает запись короче и нагляднее.</p>
29
<p>После параметров идёт символ стрелки =>. Он заменяет ключевое слово function, которое используется в обычных функциях. Стрелка визуально отделяет параметры от тела функции и делает запись короче и нагляднее.</p>
30
<p>В фигурных скобках {…} находится тело функции - блок кода, который выполняется при каждом вызове. Здесь могут проводиться любые действия: вычисления, работа со строками, условия, циклы, вызовы других функций и обработка данных. Например, если функция складывает два числа, она примет их как параметры и вернёт сумму за счёт ключевого слова return.</p>
30
<p>В фигурных скобках {…} находится тело функции - блок кода, который выполняется при каждом вызове. Здесь могут проводиться любые действия: вычисления, работа со строками, условия, циклы, вызовы других функций и обработка данных. Например, если функция складывает два числа, она примет их как параметры и вернёт сумму за счёт ключевого слова return.</p>
31
<p>Стрелочная функция (arrow function) - это официальное и самое распространённое название, которое вы встретите в документации ES6.</p>
31
<p>Стрелочная функция (arrow function) - это официальное и самое распространённое название, которое вы встретите в документации ES6.</p>
32
<p>Иногда используют и другие варианты:</p>
32
<p>Иногда используют и другие варианты:</p>
33
<ul><li>"функция-стрелка" - неформальное сокращение;</li>
33
<ul><li>"функция-стрелка" - неформальное сокращение;</li>
34
<li>"стрелка" - ещё короче, если из контекста понятно, о чём речь;</li>
34
<li>"стрелка" - ещё короче, если из контекста понятно, о чём речь;</li>
35
<li>ES6 arrow function - подчёркивает, что синтаксис появился в шестой редакции стандарта.</li>
35
<li>ES6 arrow function - подчёркивает, что синтаксис появился в шестой редакции стандарта.</li>
36
</ul><p>Также вам могут встретиться названия вроде "жирная стрелка" или "функция без this", но это скорее попытки объяснить поведение или внешний вид, чем общепринятые термины. Старайтесь придерживаться названия arrow function или "стрелочная функция", особенно на этапе изучения языка.</p>
36
</ul><p>Также вам могут встретиться названия вроде "жирная стрелка" или "функция без this", но это скорее попытки объяснить поведение или внешний вид, чем общепринятые термины. Старайтесь придерживаться названия arrow function или "стрелочная функция", особенно на этапе изучения языка.</p>
37
<p>Чтобы использовать стрелочную функцию по имени, её сохраняют в переменной с помощью ключевых слов let или const. Чаще всего применяется const, поскольку функции обычно не переопределяются:</p>
37
<p>Чтобы использовать стрелочную функцию по имени, её сохраняют в переменной с помощью ключевых слов let или const. Чаще всего применяется const, поскольку функции обычно не переопределяются:</p>
38
const functionName = (parameter1, parameter2) => { return result; };<p>После объявления стрелочную функцию можно использовать в любом месте кода в пределах её <a>области видимости</a>. Для этого достаточно указать имя переменной и добавить круглые скобки с аргументами, если они нужны:</p>
38
const functionName = (parameter1, parameter2) => { return result; };<p>После объявления стрелочную функцию можно использовать в любом месте кода в пределах её <a>области видимости</a>. Для этого достаточно указать имя переменной и добавить круглые скобки с аргументами, если они нужны:</p>
39
functionName(value1, value2);<p>Результат выполнения функции можно вывести в консоль:</p>
39
functionName(value1, value2);<p>Результат выполнения функции можно вывести в консоль:</p>
40
console.log(functionName(value1, value2));<p>Или сохранить в переменную:</p>
40
console.log(functionName(value1, value2));<p>Или сохранить в переменную:</p>
41
const resultValue = functionName(value1, value2);<p>Для примера создадим функцию, которая вычисляет сумму двух чисел:</p>
41
const resultValue = functionName(value1, value2);<p>Для примера создадим функцию, которая вычисляет сумму двух чисел:</p>
42
// Объявляем стрелочную функцию с двумя параметрами const calculateSum = (firstNumber, secondNumber) => { return firstNumber + secondNumber; }; // Вызываем функцию и выводим результат console.log(calculateSum(2, 3)); // 5<p>Обратите внимание: точки с запятой необходимы после закрывающей фигурной скобки и после инструкций внутри функции. Это связано с правилами JavaScript по завершению инструкций. Хотя язык поддерживает<a>автоматическую вставку точек с запятой</a>, лучше ставить их вручную - это поможет избежать неожиданных ошибок и сделает код более понятным:</p>
42
// Объявляем стрелочную функцию с двумя параметрами const calculateSum = (firstNumber, secondNumber) => { return firstNumber + secondNumber; }; // Вызываем функцию и выводим результат console.log(calculateSum(2, 3)); // 5<p>Обратите внимание: точки с запятой необходимы после закрывающей фигурной скобки и после инструкций внутри функции. Это связано с правилами JavaScript по завершению инструкций. Хотя язык поддерживает<a>автоматическую вставку точек с запятой</a>, лучше ставить их вручную - это поможет избежать неожиданных ошибок и сделает код более понятным:</p>
43
// ✅ Код с точками с запятой - безопасен const sum = (a, b) => { return a + b; // Завершаем инструкцию }; // Ставим точку с запятой после объявления // ⚠️ Код без точек с запятой - может привести к ошибкам const multiply = (a, b) => { return a * b }<p>JavaScript -<a>динамически типизируемый язык</a>, в котором переменные могут менять свой тип данных прямо во время выполнения программы:</p>
43
// ✅ Код с точками с запятой - безопасен const sum = (a, b) => { return a + b; // Завершаем инструкцию }; // Ставим точку с запятой после объявления // ⚠️ Код без точек с запятой - может привести к ошибкам const multiply = (a, b) => { return a * b }<p>JavaScript -<a>динамически типизируемый язык</a>, в котором переменные могут менять свой тип данных прямо во время выполнения программы:</p>
44
let userAge = 25; // Сохраняем в переменную число userAge = "двадцать пять"; // Меняем на строку userAge = false; // А потом на булево значение<p>Динамическая типизация может привести к ошибкам - например, если вы случайно переопределите функцию другим типом данных:</p>
44
let userAge = 25; // Сохраняем в переменную число userAge = "двадцать пять"; // Меняем на строку userAge = false; // А потом на булево значение<p>Динамическая типизация может привести к ошибкам - например, если вы случайно переопределите функцию другим типом данных:</p>
45
// Объявляем функцию обычным способом (function declaration) function calculatePrice(quantity, price) { return quantity * price; } console.log(calculatePrice(5, 100)); // 500 // Перезаписываем переменную - теперь это строка, а не функция calculatePrice = "вычислить цену"; // Делаем новую попытку вызова console.log(calculatePrice(10, 200)); // TypeError: calculatePrice is not a function<p>Такие ситуации возникают, когда функция объявлена через function declaration или сохранена в переменную с помощью var или let.</p>
45
// Объявляем функцию обычным способом (function declaration) function calculatePrice(quantity, price) { return quantity * price; } console.log(calculatePrice(5, 100)); // 500 // Перезаписываем переменную - теперь это строка, а не функция calculatePrice = "вычислить цену"; // Делаем новую попытку вызова console.log(calculatePrice(10, 200)); // TypeError: calculatePrice is not a function<p>Такие ситуации возникают, когда функция объявлена через function declaration или сохранена в переменную с помощью var или let.</p>
46
<p>Чтобы избежать случайного переопределения, функции лучше объявлять через const везде, где это возможно. Для этого подойдут функциональные выражения и стрелочные функции - но стрелки обычно компактнее:</p>
46
<p>Чтобы избежать случайного переопределения, функции лучше объявлять через const везде, где это возможно. Для этого подойдут функциональные выражения и стрелочные функции - но стрелки обычно компактнее:</p>
47
// Функциональное выражение const calculatePrice = function (quantity, price) { return quantity * price; }; console.log(calculatePrice(5, 100)); // 500 calculatePrice = "вычислить цену"; // Ошибка: Assignment to constant variable // Стрелочная функция const calculateTotal = (quantity, price) => quantity * price; console.log(calculateTotal(10, 200)); // 2000 calculateTotal = "посчитать сумму"; // Assignment to constant variable<p>В примерах выше мы объявили функции через const, проверили их работу и попытались присвоить им строковые значения. JavaScript выдал ошибку Assignment to constant variable, поскольку константы нельзя изменить после присваивания. Благодаря этому наши функции не превратились в строки.</p>
47
// Функциональное выражение const calculatePrice = function (quantity, price) { return quantity * price; }; console.log(calculatePrice(5, 100)); // 500 calculatePrice = "вычислить цену"; // Ошибка: Assignment to constant variable // Стрелочная функция const calculateTotal = (quantity, price) => quantity * price; console.log(calculateTotal(10, 200)); // 2000 calculateTotal = "посчитать сумму"; // Assignment to constant variable<p>В примерах выше мы объявили функции через const, проверили их работу и попытались присвоить им строковые значения. JavaScript выдал ошибку Assignment to constant variable, поскольку константы нельзя изменить после присваивания. Благодаря этому наши функции не превратились в строки.</p>
48
<p>Использование const - лишь базовая защита от проблем, связанных с динамической типизацией в JavaScript. На практике разработчики применяют целый набор инструментов для более надёжной работы с типами данных. Например, используют расширения языка вроде TypeScript и средства статического анализа, чтобы находить ошибки ещё до запуска программы.</p>
48
<p>Использование const - лишь базовая защита от проблем, связанных с динамической типизацией в JavaScript. На практике разработчики применяют целый набор инструментов для более надёжной работы с типами данных. Например, используют расширения языка вроде TypeScript и средства статического анализа, чтобы находить ошибки ещё до запуска программы.</p>
49
<p>Мы уже разобрали базовый синтаксис стрелочных функций. Теперь рассмотрим другие способы их записи: сокращённую форму с неявным возвратом, запись с одним параметром, без параметров, многострочную с явным return, а также с параметрами по умолчанию и rest-параметрами.</p>
49
<p>Мы уже разобрали базовый синтаксис стрелочных функций. Теперь рассмотрим другие способы их записи: сокращённую форму с неявным возвратом, запись с одним параметром, без параметров, многострочную с явным return, а также с параметрами по умолчанию и rest-параметрами.</p>
50
<p>Если тело стрелочной функции содержит всего одно выражение, можно опустить фигурные скобки и ключевое слово return. Посмотрите пример:</p>
50
<p>Если тело стрелочной функции содержит всего одно выражение, можно опустить фигурные скобки и ключевое слово return. Посмотрите пример:</p>
51
const addNumbers = (firstValue, secondValue) => { return firstValue + secondValue; }; console.log(addNumbers(5, 3)); // 8<p>Здесь мы явно указываем возвращаемое значение с помощью return - это называется явным возвратом. Теперь упростим функцию:</p>
51
const addNumbers = (firstValue, secondValue) => { return firstValue + secondValue; }; console.log(addNumbers(5, 3)); // 8<p>Здесь мы явно указываем возвращаемое значение с помощью return - это называется явным возвратом. Теперь упростим функцию:</p>
52
const addNumbers = (firstValue, secondValue) => firstValue + secondValue; console.log(addNumbers(5, 3)); // 8<p>В новой записи мы опускаем ключевое слово return, но JavaScript всё равно автоматически возвращает результат единственного выражения. Такое поведение стрелочной функции называется неявным возвратом.</p>
52
const addNumbers = (firstValue, secondValue) => firstValue + secondValue; console.log(addNumbers(5, 3)); // 8<p>В новой записи мы опускаем ключевое слово return, но JavaScript всё равно автоматически возвращает результат единственного выражения. Такое поведение стрелочной функции называется неявным возвратом.</p>
53
<p>Неявный возврат без круглых скобок работает для строк, чисел и других типов данных - за исключением<a>объектов</a>. Если стрелочная функция должна вернуть объект, его нужно обернуть в круглые скобки. Иначе JavaScript воспримет фигурные скобки как начало блока кода и вернёт undefined:</p>
53
<p>Неявный возврат без круглых скобок работает для строк, чисел и других типов данных - за исключением<a>объектов</a>. Если стрелочная функция должна вернуть объект, его нужно обернуть в круглые скобки. Иначе JavaScript воспримет фигурные скобки как начало блока кода и вернёт undefined:</p>
54
const createPerson = name => ({ name: name }); console.log(createPerson("Нео")); // { name: "Нео" } // Создадим новую переменную и попробуем вернуть объект без круглых скобок const newPerson = name => { name: name }; console.log(newPerson("Нео")); // undefined<p>В отличие от стрелочных функций, обычные функции и функциональные выражения всегда требуют явного указания оператора return. Без него они возвращают undefined, даже если внутри выполняются какие-либо действия:</p>
54
const createPerson = name => ({ name: name }); console.log(createPerson("Нео")); // { name: "Нео" } // Создадим новую переменную и попробуем вернуть объект без круглых скобок const newPerson = name => { name: name }; console.log(newPerson("Нео")); // undefined<p>В отличие от стрелочных функций, обычные функции и функциональные выражения всегда требуют явного указания оператора return. Без него они возвращают undefined, даже если внутри выполняются какие-либо действия:</p>
55
// ❌ Без return функция ничего не возвращает function computeArea(width, height) { width * height; } console.log(computeArea(4, 5)); // undefined // ✅ С return всё работает function computeArea(width, height) { return width * height; } console.log(computeArea(4, 5)); // 20<p>Если стрелочная функция принимает один параметр, круглые скобки вокруг него можно опустить. Напишем функцию для вычисления площади квадрата:</p>
55
// ❌ Без return функция ничего не возвращает function computeArea(width, height) { width * height; } console.log(computeArea(4, 5)); // undefined // ✅ С return всё работает function computeArea(width, height) { return width * height; } console.log(computeArea(4, 5)); // 20<p>Если стрелочная функция принимает один параметр, круглые скобки вокруг него можно опустить. Напишем функцию для вычисления площади квадрата:</p>
56
const calculateSquareSide = (length) => { return length * length; };<p>Теперь уберём круглые скобки вокруг параметра и немного упростим запись:</p>
56
const calculateSquareSide = (length) => { return length * length; };<p>Теперь уберём круглые скобки вокруг параметра и немного упростим запись:</p>
57
const calculateSquareSide = length => { return length * length; };<p>Поскольку тело функции состоит всего из одного выражения, мы можем ещё больше сократить запись и использовать неявный возврат значения:</p>
57
const calculateSquareSide = length => { return length * length; };<p>Поскольку тело функции состоит всего из одного выражения, мы можем ещё больше сократить запись и использовать неявный возврат значения:</p>
58
const calculateSquareSide = length => length * length;<p>Для закрепления давайте попрактикуемся и используем нашу стрелочную функцию для вычисления площади квадратов с разной длиной стороны:</p>
58
const calculateSquareSide = length => length * length;<p>Для закрепления давайте попрактикуемся и используем нашу стрелочную функцию для вычисления площади квадратов с разной длиной стороны:</p>
59
const calculateSquareSide = length => length * length; // Передаём в функцию разные значения и сохраняем результаты в переменных const smallSquare = calculateSquareSide(4); const mediumSquare = calculateSquareSide(6); const largeSquare = calculateSquareSide(10); // Выводим результат в консоль console.log('Площадь маленького квадрата:', smallSquare); // Площадь маленького квадрата: 16 console.log('Площадь среднего квадрата:', mediumSquare); // Площадь среднего квадрата: 36 console.log('Площадь большого квадрата:', largeSquare); // Площадь большого квадрата: 100<p>Если стрелочная функция не принимает параметров, перед стрелкой нужно указать пустые круглые скобки. Они показывают, что функция не принимает аргументов. Создадим функцию, которая просто с нами поздоровается:</p>
59
const calculateSquareSide = length => length * length; // Передаём в функцию разные значения и сохраняем результаты в переменных const smallSquare = calculateSquareSide(4); const mediumSquare = calculateSquareSide(6); const largeSquare = calculateSquareSide(10); // Выводим результат в консоль console.log('Площадь маленького квадрата:', smallSquare); // Площадь маленького квадрата: 16 console.log('Площадь среднего квадрата:', mediumSquare); // Площадь среднего квадрата: 36 console.log('Площадь большого квадрата:', largeSquare); // Площадь большого квадрата: 100<p>Если стрелочная функция не принимает параметров, перед стрелкой нужно указать пустые круглые скобки. Они показывают, что функция не принимает аргументов. Создадим функцию, которая просто с нами поздоровается:</p>
60
const getWelcome = () => "Привет!"; console.log(getWelcome()); // Привет!<p>Если вы уберёте круглые скобки перед стрелкой, функция не сработает:</p>
60
const getWelcome = () => "Привет!"; console.log(getWelcome()); // Привет!<p>Если вы уберёте круглые скобки перед стрелкой, функция не сработает:</p>
61
const getWelcome = => "Привет!"; console.log(getWelcome()); // Uncaught SyntaxError: Unexpected token '=>'<p>Создадим функцию, которая принимает два параметра и возвращает объект с тремя свойствами. Для начала рассмотрим вариант с неявным возвратом:</p>
61
const getWelcome = => "Привет!"; console.log(getWelcome()); // Uncaught SyntaxError: Unexpected token '=>'<p>Создадим функцию, которая принимает два параметра и возвращает объект с тремя свойствами. Для начала рассмотрим вариант с неявным возвратом:</p>
62
const getPersonInfo = (name, age) => ({ name: name, age: age, greeting: `Привет, меня зовут ${name}!` });<p>Наша функция записана в одну строку, но даже такой объект читать не слишком удобно. Если свойств станет больше или в теле функции появятся дополнительные операции, код станет менее наглядным. В таких случаях лучше использовать явный возврат через return с фигурными скобками:</p>
62
const getPersonInfo = (name, age) => ({ name: name, age: age, greeting: `Привет, меня зовут ${name}!` });<p>Наша функция записана в одну строку, но даже такой объект читать не слишком удобно. Если свойств станет больше или в теле функции появятся дополнительные операции, код станет менее наглядным. В таких случаях лучше использовать явный возврат через return с фигурными скобками:</p>
63
const getPersonInfo = (name, age) => { return { name: name, age: age, greeting: `Привет, меня зовут ${name}!` }; };<p>Сохраним результат работы функции в переменную и выведем его в консоль:</p>
63
const getPersonInfo = (name, age) => { return { name: name, age: age, greeting: `Привет, меня зовут ${name}!` }; };<p>Сохраним результат работы функции в переменную и выведем его в консоль:</p>
64
const person = getPersonInfo('Тор', 1500); console.log(person); // { name: 'Тор', age: 1500, greeting: 'Привет, меня зовут Тор!' }<p>Напомним про return: как только функция встречает этот оператор, она завершает выполнение и возвращает значение. Поэтому весь код, который вы напишете после return, интерпретатор JavaScript просто проигнорирует:</p>
64
const person = getPersonInfo('Тор', 1500); console.log(person); // { name: 'Тор', age: 1500, greeting: 'Привет, меня зовут Тор!' }<p>Напомним про return: как только функция встречает этот оператор, она завершает выполнение и возвращает значение. Поэтому весь код, который вы напишете после return, интерпретатор JavaScript просто проигнорирует:</p>
65
const getPersonInfo = (name, age) => { console.log('Начало функции'); return { name: name, age: age, greeting: `Привет, меня зовут ${name}!` }; // Этот код никогда не выполнится console.log('Конец функции'); }; const person = getPersonInfo('Тор', 1500); console.log(person); // Вывод в консоли: // Начало функции // { name: 'Тор', age: 1500, greeting: 'Привет, меня зовут Тор!' }<p>А теперь давайте забудем поставить return. В этом случае JavaScript выдаст синтаксическую ошибку, поскольку не сможет корректно интерпретировать фигурные скобки. Он воспримет их как тело функции, а не как объект. А внутри тела функции нельзя просто перечислять свойства через запятую:</p>
65
const getPersonInfo = (name, age) => { console.log('Начало функции'); return { name: name, age: age, greeting: `Привет, меня зовут ${name}!` }; // Этот код никогда не выполнится console.log('Конец функции'); }; const person = getPersonInfo('Тор', 1500); console.log(person); // Вывод в консоли: // Начало функции // { name: 'Тор', age: 1500, greeting: 'Привет, меня зовут Тор!' }<p>А теперь давайте забудем поставить return. В этом случае JavaScript выдаст синтаксическую ошибку, поскольку не сможет корректно интерпретировать фигурные скобки. Он воспримет их как тело функции, а не как объект. А внутри тела функции нельзя просто перечислять свойства через запятую:</p>
66
const getPersonInfo = (name, age) => { { name: name, age: age, greeting: `Привет, меня зовут ${name}!` }; }; const person = getPersonInfo("Тор", 1500); console.log(person); // SyntaxError: Unexpected token ':'<p>При вызове стрелочной функции иногда важно учитывать случаи, когда пользователь не передаёт аргументы. В таких ситуациях можно задать значения по умолчанию - они подставятся вместо отсутствующих данных.</p>
66
const getPersonInfo = (name, age) => { { name: name, age: age, greeting: `Привет, меня зовут ${name}!` }; }; const person = getPersonInfo("Тор", 1500); console.log(person); // SyntaxError: Unexpected token ':'<p>При вызове стрелочной функции иногда важно учитывать случаи, когда пользователь не передаёт аргументы. В таких ситуациях можно задать значения по умолчанию - они подставятся вместо отсутствующих данных.</p>
67
<p>К примеру, если пользователь не заполнил поле с именем в форме, мы можем использовать стандартное обращение, чтобы вывести понятное сообщение:</p>
67
<p>К примеру, если пользователь не заполнил поле с именем в форме, мы можем использовать стандартное обращение, чтобы вывести понятное сообщение:</p>
68
const welcomeMessage = (name = "гость") => { return `Привет, ${name}!`; }; console.log(welcomeMessage()); // Привет, гость! console.log(welcomeMessage("Владимир")); // Привет, Владимир!<p>Чтобы задать значение по умолчанию, укажите его после имени параметра через знак равенства. Вы можете установить значения по умолчанию как для одного параметра, так и для нескольких или всех сразу. Рассмотрим пример с тремя параметрами, каждый из которых имеет своё значение по умолчанию:</p>
68
const welcomeMessage = (name = "гость") => { return `Привет, ${name}!`; }; console.log(welcomeMessage()); // Привет, гость! console.log(welcomeMessage("Владимир")); // Привет, Владимир!<p>Чтобы задать значение по умолчанию, укажите его после имени параметра через знак равенства. Вы можете установить значения по умолчанию как для одного параметра, так и для нескольких или всех сразу. Рассмотрим пример с тремя параметрами, каждый из которых имеет своё значение по умолчанию:</p>
69
const userProfile = (name = "гость", age = 18, city = "не указан") => { return `Профиль: ${name}, возраст: ${age}, город: ${city}`; }; console.log(userProfile()); // Профиль: гость, возраст: 18, город: не указан console.log(userProfile("Максим", 25)); // Профиль: Максим, возраст: 25, город: не указан console.log(userProfile("Иван", 30, "Москва")); // Профиль: Иван, возраст: 30, город: Москва<p>В качестве значений по умолчанию можно использовать любые допустимые выражения JavaScript - строки, числа, булевы значения, объекты, массивы, результаты вычислений и так далее. Например, давайте создадим функцию, которая при отсутствии аргумента будет генерировать случайное число:</p>
69
const userProfile = (name = "гость", age = 18, city = "не указан") => { return `Профиль: ${name}, возраст: ${age}, город: ${city}`; }; console.log(userProfile()); // Профиль: гость, возраст: 18, город: не указан console.log(userProfile("Максим", 25)); // Профиль: Максим, возраст: 25, город: не указан console.log(userProfile("Иван", 30, "Москва")); // Профиль: Иван, возраст: 30, город: Москва<p>В качестве значений по умолчанию можно использовать любые допустимые выражения JavaScript - строки, числа, булевы значения, объекты, массивы, результаты вычислений и так далее. Например, давайте создадим функцию, которая при отсутствии аргумента будет генерировать случайное число:</p>
70
// Генерируем случайное число от 0 до 99 const getRandom = () => Math.floor(Math.random() * 100); // Создаём функцию со значением по умолчанию const showValue = (value = getRandom()) => { return `Значение: ${value}`; }; // Если аргумент не передан, получаем случайное число console.log(showValue()); // Значение: 73 (у вас будет другое) // Если аргумент передан, используем переданное значение console.log(showValue(42)); // Значение: 42<p>Бывают ситуации, когда мы не можем заранее определить точное количество аргументов для функции. Например, пользователь может ввести любое количество своих увлечений - два, три, десять или сколько угодно ещё.</p>
70
// Генерируем случайное число от 0 до 99 const getRandom = () => Math.floor(Math.random() * 100); // Создаём функцию со значением по умолчанию const showValue = (value = getRandom()) => { return `Значение: ${value}`; }; // Если аргумент не передан, получаем случайное число console.log(showValue()); // Значение: 73 (у вас будет другое) // Если аргумент передан, используем переданное значение console.log(showValue(42)); // Значение: 42<p>Бывают ситуации, когда мы не можем заранее определить точное количество аргументов для функции. Например, пользователь может ввести любое количество своих увлечений - два, три, десять или сколько угодно ещё.</p>
71
<p>В обычных функциях для таких случаев можно использовать<a>специальный объект</a>arguments, который содержит все переданные значения. Напишем функцию, которая получает имя и собирает остальные аргументы в массив:</p>
71
<p>В обычных функциях для таких случаев можно использовать<a>специальный объект</a>arguments, который содержит все переданные значения. Напишем функцию, которая получает имя и собирает остальные аргументы в массив:</p>
72
function getUserInfo(name) { // Получаем все аргументы начиная со второго const hobbies = Array.prototype.slice.call(arguments, 1); return `${name} увлекается: ${hobbies.join(', ')}`; } console.log(getUserInfo('Алексей', 'рисованием', 'музыкой', 'спортом')); // Алексей увлекается: рисованием, музыкой, спортом<p>В стрелочных функциях вместо объекта arguments используются<a>остаточные параметры</a>(rest-параметр). Они записываются с помощью трёх точек перед именем параметра и собирают все оставшиеся аргументы в массив:</p>
72
function getUserInfo(name) { // Получаем все аргументы начиная со второго const hobbies = Array.prototype.slice.call(arguments, 1); return `${name} увлекается: ${hobbies.join(', ')}`; } console.log(getUserInfo('Алексей', 'рисованием', 'музыкой', 'спортом')); // Алексей увлекается: рисованием, музыкой, спортом<p>В стрелочных функциях вместо объекта arguments используются<a>остаточные параметры</a>(rest-параметр). Они записываются с помощью трёх точек перед именем параметра и собирают все оставшиеся аргументы в массив:</p>
73
const getUserInfo = (name, ...hobbies) => { return `${name} увлекается: ${hobbies.join(', ')}`; }; console.log(getUserInfo('Алексей', 'рисованием', 'музыкой', 'спортом')); // Алексей увлекается: рисованием, музыкой, спортом<p>Rest-параметр может быть только один - он собирает все оставшиеся аргументы и всегда должен стоять в конце списка параметров. Если вы попытаетесь разместить его в начале или в середине, JavaScript выдаст синтаксическую ошибку. Давайте укажем rest-параметр с ошибкой:</p>
73
const getUserInfo = (name, ...hobbies) => { return `${name} увлекается: ${hobbies.join(', ')}`; }; console.log(getUserInfo('Алексей', 'рисованием', 'музыкой', 'спортом')); // Алексей увлекается: рисованием, музыкой, спортом<p>Rest-параметр может быть только один - он собирает все оставшиеся аргументы и всегда должен стоять в конце списка параметров. Если вы попытаетесь разместить его в начале или в середине, JavaScript выдаст синтаксическую ошибку. Давайте укажем rest-параметр с ошибкой:</p>
74
// ❌ Неправильно: rest-параметр должен быть последним const getUserInfo = (...hobbies, name) => { return `${name} увлекается: ${hobbies.join(', ')}`; }; console.log(getUserInfo('рисованием', 'музыкой', 'спортом', 'Алексей')); // SyntaxError: Rest parameter must be last formal parameter<p>Мы рассмотрели разные способы записи стрелочных функций в JavaScript. При выборе синтаксиса важно учитывать не только личные предпочтения, но и правила, установленные в команде. Например, если в проекте принято использовать явный return с фигурными скобками, более краткие формы записи вам могут не понадобиться - даже если они технически допустимы:</p>
74
// ❌ Неправильно: rest-параметр должен быть последним const getUserInfo = (...hobbies, name) => { return `${name} увлекается: ${hobbies.join(', ')}`; }; console.log(getUserInfo('рисованием', 'музыкой', 'спортом', 'Алексей')); // SyntaxError: Rest parameter must be last formal parameter<p>Мы рассмотрели разные способы записи стрелочных функций в JavaScript. При выборе синтаксиса важно учитывать не только личные предпочтения, но и правила, установленные в команде. Например, если в проекте принято использовать явный return с фигурными скобками, более краткие формы записи вам могут не понадобиться - даже если они технически допустимы:</p>
75
// Всегда используем явный return const add = (a, b) => { return a + b; }; const square = x => { return x * x; }; const getMessage = () => { return 'Hello!'; };<p>Область видимости - это часть кода, где функция может обращаться к переменным. В JavaScript есть два основных типа областей видимости: глобальная (доступна во всём коде) и локальная (ограничена блоком кода).</p>
75
// Всегда используем явный return const add = (a, b) => { return a + b; }; const square = x => { return x * x; }; const getMessage = () => { return 'Hello!'; };<p>Область видимости - это часть кода, где функция может обращаться к переменным. В JavaScript есть два основных типа областей видимости: глобальная (доступна во всём коде) и локальная (ограничена блоком кода).</p>
76
<p>Представьте функцию как человека в комнате: он пользуется своими вещами (локальными переменными) и видит то, что находится в коридоре или гостиной (внешние переменные). А вот заглянуть в чужую комнату он не может, поскольку переменные в других функциях для него недоступны.</p>
76
<p>Представьте функцию как человека в комнате: он пользуется своими вещами (локальными переменными) и видит то, что находится в коридоре или гостиной (внешние переменные). А вот заглянуть в чужую комнату он не может, поскольку переменные в других функциях для него недоступны.</p>
77
<p>В JavaScript обычные функции "<a>всплывают</a>" - это значит, что их можно вызвать ещё до того, как они объявлены в коде:</p>
77
<p>В JavaScript обычные функции "<a>всплывают</a>" - это значит, что их можно вызвать ещё до того, как они объявлены в коде:</p>
78
greetAstronaut(); // Добро пожаловать на борт! function greetAstronaut() { console.log("Добро пожаловать на борт!"); }<p>А вот стрелочные функции работают только после объявления:</p>
78
greetAstronaut(); // Добро пожаловать на борт! function greetAstronaut() { console.log("Добро пожаловать на борт!"); }<p>А вот стрелочные функции работают только после объявления:</p>
79
greetAlien(); // ReferenceError: Cannot access 'greetAlien' before initialization const greetAlien = () => { console.log("Контакт установлен!"); }; greetAlien(); // Контакт установлен!<p>Всплытие может запутывать и приводить к неожиданным ошибкам. Чтобы сделать код более предсказуемым, обычные функции лучше объявлять как функциональные выражения через const. В этом случае они будут вести себя так же, как стрелочные, - их можно будет вызывать только после объявления:</p>
79
greetAlien(); // ReferenceError: Cannot access 'greetAlien' before initialization const greetAlien = () => { console.log("Контакт установлен!"); }; greetAlien(); // Контакт установлен!<p>Всплытие может запутывать и приводить к неожиданным ошибкам. Чтобы сделать код более предсказуемым, обычные функции лучше объявлять как функциональные выражения через const. В этом случае они будут вести себя так же, как стрелочные, - их можно будет вызывать только после объявления:</p>
80
const greetNavigator = function () { console.log("Внимание, навигатор!"); }; greetNavigator(); // Внимание, навигатор!<p>Если не учитывать всплытие, обычные и стрелочные функции ведут себя одинаково - они работают только внутри той области, где были объявлены.</p>
80
const greetNavigator = function () { console.log("Внимание, навигатор!"); }; greetNavigator(); // Внимание, навигатор!<p>Если не учитывать всплытие, обычные и стрелочные функции ведут себя одинаково - они работают только внутри той области, где были объявлены.</p>
81
<p>Давайте убедимся в этом на примере: поместим стрелочную функцию и функциональное выражение внутрь блока и попробуем с ними поработать. Сначала вызовем их внутри блока, а затем обратимся к ним или к их внутренним переменным снаружи. Так мы увидим, где возникнут ошибки:</p>
81
<p>Давайте убедимся в этом на примере: поместим стрелочную функцию и функциональное выражение внутрь блока и попробуем с ними поработать. Сначала вызовем их внутри блока, а затем обратимся к ним или к их внутренним переменным снаружи. Так мы увидим, где возникнут ошибки:</p>
82
{ const giveOrder = () => { const command = "Запустить двигатель"; console.log(command); }; const relayMessage = function () { const message = "Принять сигнал"; console.log(message); }; // Вызываем функции внутри блока - всё работает giveOrder(); // ✅ Запустить двигатель relayMessage(); // ✅ Принять сигнал } // Вызываем функции и переменные снаружи - получаем ошибки giveOrder(); // ❌ ReferenceError console.log(command); // ❌ ReferenceError relayMessage(); // ❌ ReferenceError console.log(message); // ❌ ReferenceError<p>Область видимости отвечает за то, какие переменные видит функция. Но, помимо этого, у функции есть ещё одна важная особенность -<a>контекст</a>. Он задаётся значением this и показывает, от чьего имени выполняется функция. У обычных функций this зависит от того, как именно они были вызваны. Стрелочные функции не создают собственный контекст this - они наследуют его из внешней области, и это значение остаётся неизменным:</p>
82
{ const giveOrder = () => { const command = "Запустить двигатель"; console.log(command); }; const relayMessage = function () { const message = "Принять сигнал"; console.log(message); }; // Вызываем функции внутри блока - всё работает giveOrder(); // ✅ Запустить двигатель relayMessage(); // ✅ Принять сигнал } // Вызываем функции и переменные снаружи - получаем ошибки giveOrder(); // ❌ ReferenceError console.log(command); // ❌ ReferenceError relayMessage(); // ❌ ReferenceError console.log(message); // ❌ ReferenceError<p>Область видимости отвечает за то, какие переменные видит функция. Но, помимо этого, у функции есть ещё одна важная особенность -<a>контекст</a>. Он задаётся значением this и показывает, от чьего имени выполняется функция. У обычных функций this зависит от того, как именно они были вызваны. Стрелочные функции не создают собственный контекст this - они наследуют его из внешней области, и это значение остаётся неизменным:</p>
83
const crew = { title: "Главный инженер", // Обычная функция: получает собственный this при вызове report: function () { console.log("Обычная функция:", this.title); }, // Стрелочная функция: не создаёт свой this, берёт его снаружи announce: () => { console.log("Стрелочная функция:", this.title); } }; // Обычная функция: this указывает на crew crew.report(); // Главный инженер // Стрелочная функция не видит объект crew как this crew.announce(); // undefined<p>Контекст - одна из сложных тем в JavaScript. Он тесно связан со стрелочными функциями, явным и неявным связыванием this, методами bind (), call (), apply (), а также с поведением this в классах и конструкторах. Все эти особенности мы обязательно разберём отдельно.</p>
83
const crew = { title: "Главный инженер", // Обычная функция: получает собственный this при вызове report: function () { console.log("Обычная функция:", this.title); }, // Стрелочная функция: не создаёт свой this, берёт его снаружи announce: () => { console.log("Стрелочная функция:", this.title); } }; // Обычная функция: this указывает на crew crew.report(); // Главный инженер // Стрелочная функция не видит объект crew как this crew.announce(); // undefined<p>Контекст - одна из сложных тем в JavaScript. Он тесно связан со стрелочными функциями, явным и неявным связыванием this, методами bind (), call (), apply (), а также с поведением this в классах и конструкторах. Все эти особенности мы обязательно разберём отдельно.</p>
84
<p>У стрелочных функций короткий современный синтаксис, который часто встречается в учебных материалах, библиотеках и проектах. Рассмотрим основные ситуации, в которых с ними чаще всего сталкиваются новички.</p>
84
<p>У стрелочных функций короткий современный синтаксис, который часто встречается в учебных материалах, библиотеках и проектах. Рассмотрим основные ситуации, в которых с ними чаще всего сталкиваются новички.</p>
85
<p><strong>Простые вычисления и преобразования.</strong>Это случаи, когда нужно быстро обработать данные: проверить длину строки, сравнить значения, округлить результат, преобразовать текст или вернуть какой-то результат.</p>
85
<p><strong>Простые вычисления и преобразования.</strong>Это случаи, когда нужно быстро обработать данные: проверить длину строки, сравнить значения, округлить результат, преобразовать текст или вернуть какой-то результат.</p>
86
<p>Например, округлим число до ближайшего целого:</p>
86
<p>Например, округлим число до ближайшего целого:</p>
87
const round = num => Math.round(num); console.log(round(4.7)); // 5<p><strong>Методы массивов с колбэками.</strong><a>Колбэк</a> - это функция, которую передают как аргумент в другую функцию, чтобы та вызвала её позже. В массивах колбэки используются для перебора элементов, фильтрации по условиям, поиска нужного значения, преобразования каждого элемента или подсчёта общего результата. Умножим каждое число на 2 с помощью метода map ():</p>
87
const round = num => Math.round(num); console.log(round(4.7)); // 5<p><strong>Методы массивов с колбэками.</strong><a>Колбэк</a> - это функция, которую передают как аргумент в другую функцию, чтобы та вызвала её позже. В массивах колбэки используются для перебора элементов, фильтрации по условиям, поиска нужного значения, преобразования каждого элемента или подсчёта общего результата. Умножим каждое число на 2 с помощью метода map ():</p>
88
const round = num => Math.round(num); console.log(round(4.7)); // 5<p><strong>Обработчики событий.</strong>Это функции в JavaScript, которые отслеживают и реагируют на действия пользователя на странице. К таким действиям<a>относятся</a>клик по кнопке, движение мыши, ввод текста, прокрутка страницы и другие события. Попробуем вывести сообщение при клике по кнопке:</p>
88
const round = num => Math.round(num); console.log(round(4.7)); // 5<p><strong>Обработчики событий.</strong>Это функции в JavaScript, которые отслеживают и реагируют на действия пользователя на странице. К таким действиям<a>относятся</a>клик по кнопке, движение мыши, ввод текста, прокрутка страницы и другие события. Попробуем вывести сообщение при клике по кнопке:</p>
89
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8" /> <title>Обработка клика по кнопке</title> </head> <body> <button id="myButton">Нажми меня</button> <div id="message"></div> <script> // Находим кнопку по id const button = document.getElementById("myButton"); // Находим блок для вывода сообщения const message = document.getElementById("message"); // Обработчик события "click" button.addEventListener("click", () => { message.textContent = "Привет! Ты нажал на кнопку."; }); </script> </body> </html><p><strong>Функции как аргументы.</strong>Это ситуации, когда одну функцию передают как параметр в другую функцию для её последующего выполнения. Такой подход часто используется в <a>асинхронном программировании</a> - например, при работе с таймерами, запросами к серверу через API или обработке данных.</p>
89
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8" /> <title>Обработка клика по кнопке</title> </head> <body> <button id="myButton">Нажми меня</button> <div id="message"></div> <script> // Находим кнопку по id const button = document.getElementById("myButton"); // Находим блок для вывода сообщения const message = document.getElementById("message"); // Обработчик события "click" button.addEventListener("click", () => { message.textContent = "Привет! Ты нажал на кнопку."; }); </script> </body> </html><p><strong>Функции как аргументы.</strong>Это ситуации, когда одну функцию передают как параметр в другую функцию для её последующего выполнения. Такой подход часто используется в <a>асинхронном программировании</a> - например, при работе с таймерами, запросами к серверу через API или обработке данных.</p>
90
<p>Вызовем функцию с задержкой в две секунды с помощью<a>setTimeout</a>:</p>
90
<p>Вызовем функцию с задержкой в две секунды с помощью<a>setTimeout</a>:</p>
91
setTimeout(() => { console.log("Прошло две секунды"); }, 2000); // Прошло две секунды<p><strong>Вложенные функции.</strong>Функция может быть объявлена внутри другой функции для реализации вспомогательной логики или ограничения области видимости. Создадим внешнюю функцию, которая будет использовать вложенную функцию для преобразования имени в верхний регистр:</p>
91
setTimeout(() => { console.log("Прошло две секунды"); }, 2000); // Прошло две секунды<p><strong>Вложенные функции.</strong>Функция может быть объявлена внутри другой функции для реализации вспомогательной логики или ограничения области видимости. Создадим внешнюю функцию, которая будет использовать вложенную функцию для преобразования имени в верхний регистр:</p>
92
const createGreeting = name => { const format = text => text.toUpperCase(); return `Привет, ${format(name)}!`; }; console.log(createGreeting("Лев")); // Привет, ЛЕВ!<p>Стрелочные функции также применяются в более сложных сценариях - при работе с промисами, в цепочках вызовов и в компонентах React. Позже мы разберём их в других разделах, когда перейдём к более продвинутым темам.</p>
92
const createGreeting = name => { const format = text => text.toUpperCase(); return `Привет, ${format(name)}!`; }; console.log(createGreeting("Лев")); // Привет, ЛЕВ!<p>Стрелочные функции также применяются в более сложных сценариях - при работе с промисами, в цепочках вызовов и в компонентах React. Позже мы разберём их в других разделах, когда перейдём к более продвинутым темам.</p>
93
<p>Стрелочные функции удобны, но есть ситуации, когда лучше использовать обычные функции или функциональное выражение:</p>
93
<p>Стрелочные функции удобны, но есть ситуации, когда лучше использовать обычные функции или функциональное выражение:</p>
94
<ul><li>если нужен собственный контекст this (например, в методах объектов);</li>
94
<ul><li>если нужен собственный контекст this (например, в методах объектов);</li>
95
<li>если необходим доступ к объектам arguments или super;</li>
95
<li>если необходим доступ к объектам arguments или super;</li>
96
<li>если функция применяется как конструктор (с оператором new).</li>
96
<li>если функция применяется как конструктор (с оператором new).</li>
97
</ul><p>Это непростые концепции, с которыми мы будем знакомиться постепенно.</p>
97
</ul><p>Это непростые концепции, с которыми мы будем знакомиться постепенно.</p>
98
<p>В предыдущих разделах мы разобрали синтаксис стрелочных функций, особенности области видимости и контекста выполнения. Теперь давайте вспомним самые распространённые ошибки начинающих разработчиков.</p>
98
<p>В предыдущих разделах мы разобрали синтаксис стрелочных функций, особенности области видимости и контекста выполнения. Теперь давайте вспомним самые распространённые ошибки начинающих разработчиков.</p>
99
<p>❌ Не указаны скобки при пустых параметрах:</p>
99
<p>❌ Не указаны скобки при пустых параметрах:</p>
100
const ping = => "pong"; console.log(ping()); // SyntaxError: Unexpected token '=>'<p>✅ Скобки обязательны:</p>
100
const ping = => "pong"; console.log(ping()); // SyntaxError: Unexpected token '=>'<p>✅ Скобки обязательны:</p>
101
const fixedPing = () => "pong"; console.log(fixedPing()); // pong<p>❌ Отсутствует return в многострочной записи:</p>
101
const fixedPing = () => "pong"; console.log(fixedPing()); // pong<p>❌ Отсутствует return в многострочной записи:</p>
102
const calculatePower = () => { const base = 2; const exponent = 3; base ** exponent; }; console.log(calculatePower()); // undefined<p>✅ Добавляем return:</p>
102
const calculatePower = () => { const base = 2; const exponent = 3; base ** exponent; }; console.log(calculatePower()); // undefined<p>✅ Добавляем return:</p>
103
const fixedCalculatePower = () => { const base = 2; const exponent = 3; return base ** exponent; }; console.log(fixedCalculatePower()); // 8<p>❌ Возврат объекта без скобок:</p>
103
const fixedCalculatePower = () => { const base = 2; const exponent = 3; return base ** exponent; }; console.log(fixedCalculatePower()); // 8<p>❌ Возврат объекта без скобок:</p>
104
const createBadge = () => { label: "Guest" }; console.log(createBadge()); // undefined<p>✅ Оборачиваем объект в скобки:</p>
104
const createBadge = () => { label: "Guest" }; console.log(createBadge()); // undefined<p>✅ Оборачиваем объект в скобки:</p>
105
const fixedCreateBadge = () => ({ label: "Guest" }); console.log(fixedCreateBadge()); // { label: 'Guest' }<p>❌ Запись return без фигурных скобок:</p>
105
const fixedCreateBadge = () => ({ label: "Guest" }); console.log(fixedCreateBadge()); // { label: 'Guest' }<p>❌ Запись return без фигурных скобок:</p>
106
const showScore = () => return 100; console.log(showScore()); // SyntaxError: Unexpected token 'return'<p>✅ Добавляем фигурные скобки:</p>
106
const showScore = () => return 100; console.log(showScore()); // SyntaxError: Unexpected token 'return'<p>✅ Добавляем фигурные скобки:</p>
107
const fixedShowScore = () => { return 100; }; console.log(fixedShowScore()); // 100<p>❌ Вызов функции за пределами её области видимости:</p>
107
const fixedShowScore = () => { return 100; }; console.log(fixedShowScore()); // 100<p>❌ Вызов функции за пределами её области видимости:</p>
108
{ const status = "ready"; const getStatus = () => status; } console.log(getStatus()); // ReferenceError: getStatus is not defined<p>✅ Вызов функции внутри области видимости:</p>
108
{ const status = "ready"; const getStatus = () => status; } console.log(getStatus()); // ReferenceError: getStatus is not defined<p>✅ Вызов функции внутри области видимости:</p>
109
{ const status = "ready"; const getStatus = () => status; console.log(getStatus()); // ready }<p>❌ Некорректное использование this в объекте:</p>
109
{ const status = "ready"; const getStatus = () => status; console.log(getStatus()); // ready }<p>❌ Некорректное использование this в объекте:</p>
110
const profile = { name: "Лея", getName: () => this.name }; console.log(profile.getName()); // undefined<p>✅ Заменяем стрелочную функцию на обычную:</p>
110
const profile = { name: "Лея", getName: () => this.name }; console.log(profile.getName()); // undefined<p>✅ Заменяем стрелочную функцию на обычную:</p>
111
const fixedProfile = { name: "Лея", getName() { return this.name; } }; console.log(fixedProfile.getName()); // Лея<p>В больших проектах легко потеряться: не всегда ясно, что делает функция, какие у неё параметры и что она возвращает.</p>
111
const fixedProfile = { name: "Лея", getName() { return this.name; } }; console.log(fixedProfile.getName()); // Лея<p>В больших проектах легко потеряться: не всегда ясно, что делает функция, какие у неё параметры и что она возвращает.</p>
112
<p>Чтобы быстрее понимать чужой (и свой) код, используйте<a>JSDoc</a> - это формат комментариев, который поддерживается в редакторах вроде VS Code. Он показывает описание функции, параметры и возвращаемое значение прямо при наведении.</p>
112
<p>Чтобы быстрее понимать чужой (и свой) код, используйте<a>JSDoc</a> - это формат комментариев, который поддерживается в редакторах вроде VS Code. Он показывает описание функции, параметры и возвращаемое значение прямо при наведении.</p>
113
<p>Напишите /** перед функцией и нажмите<strong>Enter</strong> - редактор подскажет шаблон. Заполните описание, укажите параметры через @param и результат через @returns.</p>
113
<p>Напишите /** перед функцией и нажмите<strong>Enter</strong> - редактор подскажет шаблон. Заполните описание, укажите параметры через @param и результат через @returns.</p>
114
<p>Попробуйте задокументировать простую стрелочную функцию:</p>
114
<p>Попробуйте задокументировать простую стрелочную функцию:</p>
115
const calculateLoad = (base, extra) => base + extra; console.log(calculateLoad(10, 15));<p>Если вы всё сделали правильно, в VS Code появится следующее:</p>
115
const calculateLoad = (base, extra) => base + extra; console.log(calculateLoad(10, 15));<p>Если вы всё сделали правильно, в VS Code появится следующее:</p>
116
<em>Скриншот: Visual Studio Code / Skillbox Media</em><p>В этом разделе вы потренируетесь применять стрелочные функции на практике. Если что-то не получается, не спешите заглядывать в решение - сначала попробуйте воспользоваться подсказкой или перечитайте нужный раздел. И главное - старайтесь не копировать код, а набирайте его вручную. Так вы быстрее запомните синтаксис и лучше поймёте, как всё работает.</p>
116
<em>Скриншот: Visual Studio Code / Skillbox Media</em><p>В этом разделе вы потренируетесь применять стрелочные функции на практике. Если что-то не получается, не спешите заглядывать в решение - сначала попробуйте воспользоваться подсказкой или перечитайте нужный раздел. И главное - старайтесь не копировать код, а набирайте его вручную. Так вы быстрее запомните синтаксис и лучше поймёте, как всё работает.</p>
117
<p>Есть простая стрелочная функция, которая должна возвращать строку с приветствием, но при запуске в консоли выводится undefined - значение не определено. Разберитесь, что не так, и исправьте ошибку:</p>
117
<p>Есть простая стрелочная функция, которая должна возвращать строку с приветствием, но при запуске в консоли выводится undefined - значение не определено. Разберитесь, что не так, и исправьте ошибку:</p>
118
const getGreeting = () => { return "Привет из стрелочной функции!"; }; console.log(getGreeting());<p><strong>Подсказка</strong></p>
118
const getGreeting = () => { return "Привет из стрелочной функции!"; }; console.log(getGreeting());<p><strong>Подсказка</strong></p>
119
<p>JavaScript умеет автоматически расставлять точки с запятой. Обычно это удобно, но в некоторых случаях такое поведение приводит к неожиданным результатам. Обратите внимание на то, где находится return и что идёт после.</p>
119
<p>JavaScript умеет автоматически расставлять точки с запятой. Обычно это удобно, но в некоторых случаях такое поведение приводит к неожиданным результатам. Обратите внимание на то, где находится return и что идёт после.</p>
120
<p><strong>Решение</strong></p>
120
<p><strong>Решение</strong></p>
121
<p>После оператора return в коде находится перенос строки. JavaScript воспринимает это как конец инструкции и автоматически добавляет точку с запятой. А когда интерпретатор встречает return, выполнение функции немедленно прекращается. Поэтому в консоли мы видим undefined:</p>
121
<p>После оператора return в коде находится перенос строки. JavaScript воспринимает это как конец инструкции и автоматически добавляет точку с запятой. А когда интерпретатор встречает return, выполнение функции немедленно прекращается. Поэтому в консоли мы видим undefined:</p>
122
const getGreeting = () => { return // ← JavaScript вставляет точку с запятой "Привет из стрелочной функции!"; // До этой строки интерпретатор не доходит }; console.log(getGreeting()); // undefined<p>Чтобы всё исправить, достаточно перенести приветствие на строку с return:</p>
122
const getGreeting = () => { return // ← JavaScript вставляет точку с запятой "Привет из стрелочной функции!"; // До этой строки интерпретатор не доходит }; console.log(getGreeting()); // undefined<p>Чтобы всё исправить, достаточно перенести приветствие на строку с return:</p>
123
const getGreeting = () => { return "Привет из стрелочной функции!"; }; console.log(getGreeting()); // Привет из стрелочной функции!<p>Перед вами обычная функция, которая умеет складывать любое количество чисел. Перепишите её в виде стрелочной функции с помощью rest-параметра:</p>
123
const getGreeting = () => { return "Привет из стрелочной функции!"; }; console.log(getGreeting()); // Привет из стрелочной функции!<p>Перед вами обычная функция, которая умеет складывать любое количество чисел. Перепишите её в виде стрелочной функции с помощью rest-параметра:</p>
124
function sumArguments() { let total = 0; for (let i = 0; i < arguments.length; i++) { total += arguments[i]; } return total; } console.log(sumArguments(1, 2, 3)); // 6 console.log(sumArguments(10, 20, 30, 40)); // 100<p><strong>Подсказка</strong></p>
124
function sumArguments() { let total = 0; for (let i = 0; i < arguments.length; i++) { total += arguments[i]; } return total; } console.log(sumArguments(1, 2, 3)); // 6 console.log(sumArguments(10, 20, 30, 40)); // 100<p><strong>Подсказка</strong></p>
125
<p>Rest-параметр записывается с помощью трёх точек … и заменяет объект arguments в стрелочных функциях.</p>
125
<p>Rest-параметр записывается с помощью трёх точек … и заменяет объект arguments в стрелочных функциях.</p>
126
<p><strong>Заголовок</strong></p>
126
<p><strong>Заголовок</strong></p>
127
<p>Создаём стрелочную функцию и заменяем arguments на rest-параметр …numbers. В остальном коде ничего не меняем:</p>
127
<p>Создаём стрелочную функцию и заменяем arguments на rest-параметр …numbers. В остальном коде ничего не меняем:</p>
128
const sumArguments = (...numbers) => { let total = 0; // Складываем все числа из массива for (let i = 0; i < numbers.length; i++) { total += numbers[i]; } return total; // Возвращаем сумму }; console.log(sumArguments(1, 2, 3)); // 6 console.log(sumArguments(10, 20, 30, 40)); // 100<p>➤ Дополнительное задание: попробуйте решить задачу с помощью метода массива<a>reduce()</a>. Это позволит заменить цикл for и сделать код короче.</p>
128
const sumArguments = (...numbers) => { let total = 0; // Складываем все числа из массива for (let i = 0; i < numbers.length; i++) { total += numbers[i]; } return total; // Возвращаем сумму }; console.log(sumArguments(1, 2, 3)); // 6 console.log(sumArguments(10, 20, 30, 40)); // 100<p>➤ Дополнительное задание: попробуйте решить задачу с помощью метода массива<a>reduce()</a>. Это позволит заменить цикл for и сделать код короче.</p>
129
<p>В кофейне действует акция: за каждые четыре купленные чашки кофе - одна в подарок. Напишите стрелочную функцию, которая будет считать общее количество чашек: купленные и бесплатные. Пример результатов вывода:</p>
129
<p>В кофейне действует акция: за каждые четыре купленные чашки кофе - одна в подарок. Напишите стрелочную функцию, которая будет считать общее количество чашек: купленные и бесплатные. Пример результатов вывода:</p>
130
totalCups(4); // 5 totalCups(9); // 11 totalCups(25); // 31<p><strong>Подсказка</strong></p>
130
totalCups(4); // 5 totalCups(9); // 11 totalCups(25); // 31<p><strong>Подсказка</strong></p>
131
<p>За каждые четыре купленные чашки кофе покупатель получает одну в подарок. Чтобы посчитать, сколько именно бесплатных чашек он получит, используйте деление с округлением вниз. Например, при покупке девяти чашек: 9 / 4 = 2.25. Но нас интересует только целая часть - 2. Для этого примените метод<a>Math.floor ()</a>, который отбрасывает дробную часть и возвращает целое число.</p>
131
<p>За каждые четыре купленные чашки кофе покупатель получает одну в подарок. Чтобы посчитать, сколько именно бесплатных чашек он получит, используйте деление с округлением вниз. Например, при покупке девяти чашек: 9 / 4 = 2.25. Но нас интересует только целая часть - 2. Для этого примените метод<a>Math.floor ()</a>, который отбрасывает дробную часть и возвращает целое число.</p>
132
<p><strong>Решение</strong></p>
132
<p><strong>Решение</strong></p>
133
<p>Создадим функцию, которая принимает число купленных чашек. Внутри считаем, сколько чашек положено в подарок, и прибавляем их к купленным:</p>
133
<p>Создадим функцию, которая принимает число купленных чашек. Внутри считаем, сколько чашек положено в подарок, и прибавляем их к купленным:</p>
134
const totalCups = (purchased) => { return purchased + Math.floor(purchased / 4); }; console.log(totalCups(4)); // 5 console.log(totalCups(9)); // 11 console.log(totalCups(25)); // 31<a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>
134
const totalCups = (purchased) => { return purchased + Math.floor(purchased / 4); }; console.log(totalCups(4)); // 5 console.log(totalCups(9)); // 11 console.log(totalCups(25)); // 31<a>Курс с трудоустройством: "Профессия Фронтенд-разработчик + ИИ" Узнать о курсе</a>