Если вы уже работали с функциями в JS, то этот урок поможет вам писать код короче и чище. Если нет, не переживайте. Мы начнем с основ и постепенно углубимся в детали.
Что такое стрелочные функции?
Стрелочные функции (arrow functions) появились в стандарте ES6 (ES2015). Это альтернативный синтаксис для создания функций, который делает код компактнее и часто понятнее. Однако у них есть важные отличия от обычных функций, о которых мы поговорим позже.
Синтаксис стрелочных функций
Главная особенность стрелочных функций, их краткость. Давайте сравним обычную функцию и стрелочную.
Пример 1: Базовая запись
Обычная функция:
function sum(a, b) { return a + b; }
Стрелочная функция:
const sum = (a, b) => { return a + b; };
Обратите внимание:
- Ключевое слово
functionзаменяется на=>после списка параметров. - Функция сохраняется в переменную (чаще всего через
const).
Пример 2: Сокращения
Если тело функции состоит из одной строки, можно убрать фигурные скобки {} и ключевое слово return — результат вернется автоматически (неявный возврат):
const sum = (a, b) => a + b;
Пример 3: Один параметр
Если параметр один, скобки () можно опустить:
const double = num => num * 2;
Пример 4: Без параметров
Если параметров нет, скобки обязательны:
const sayHello = () => console.log("Привет!");
Разница между обычными и стрелочными функциями
Стрелочные функции не просто «синтаксический сахар». Они имеют ключевые отличия в поведении.
1. Контекст this
Обычные функции имеют свой собственный контекст this, который зависит от вызова. Например, в методах объекта this ссылается на сам объект.
Стрелочные функции не создают свой this. Они берут его из внешней области видимости (лексический контекст). Это особенно полезно в колбэках и обработчиках событий.
Пример с this:
const user = { name: "Максим", greet: function() { setTimeout(function() { console.log("Привет, " + this.name); // Ошибка! this === window }, 1000); } }; user.greet(); // Привет, undefined
Исправляем с помощью стрелочной функции:
const user = { name: "Максим", greet: function() { setTimeout(() => { console.log("Привет, " + this.name); // this берется из greet }, 1000); } }; user.greet(); // Привет, Максим
2. Отсутствие объекта arguments
В стрелочных функциях нет псевдомассива arguments. Вместо него можно использовать rest-параметры:
const showArgs = (...args) => { console.log(args); }; showArgs(1, 2, 3); // [1, 2, 3]
3. Не могут быть конструкторами
Стрелочные функции нельзя вызывать с new, так как у них нет внутреннего метода [[Construct]]:
const User = () => {}; const user = new User(); // Ошибка: User is not a constructor
Примеры использования стрелочных функций
Теперь давайте посмотрим, как стрелочные функции упрощают код на практике.
1. Колбэки
Обработчики событий или функции для методов массивов (map, filter, reduce) становятся лаконичнее:
const numbers = [1, 2, 3]; // Обычная функция const doubled = numbers.map(function(num) { return num * 2; }); // Стрелочная функция const doubled = numbers.map(num => num * 2);
2. Цепочки вызовов
Стрелочные функции удобны для цепочек методов:
const users = [ { name: "Максим", age: 30 }, { name: "Анна", age: 25 } ]; const names = users .filter(user => user.age > 25) .map(user => user.name); console.log(names); // ["Максим"]
3. Возврат объектов
Чтобы вернуть объект в однострочной стрелочной функции, оберните его в скобки ():
const createUser = (name, age) => ({ name: name, age: age }); console.log(createUser("Максим", 30)); // { name: "Максим", age: 30 }
Практические задачи
Закрепим материал на практике. Решите задачи, сверяясь с примерами выше.
Задача 1: Перепишите обычные функции в стрелочные
function multiply(a, b) { return a * b; }
document.addEventListener("click", function() { console.log("Клик!"); });
Задача 2: Исправьте код
Почему этот код выводит undefined? Исправьте его, используя стрелочную функцию.
const timer = { seconds: 10, start() { setInterval(function() { this.seconds--; console.log(this.seconds); }, 1000); } }; timer.start();
Задача 3: Работа с массивами
Дан массив чисел. Используя стрелочные функции:
- Увеличьте каждое число на 5.
- Отфильтруйте числа больше 20.
- Найдите сумму оставшихся чисел.
Исходный массив:
[10, 15, 20, 25, 30]
Ответы к задачам
Ответ 1:
const multiply = (a, b) => a * b;
document.addEventListener("click", () => console.log("Клик!"));
Ответ 2:
Ошибка возникает, потому что this внутри setInterval ссылается на глобальный объект. Исправление:
const timer = { seconds: 10, start() { setInterval(() => { this.seconds--; console.log(this.seconds); }, 1000); } }; timer.start();
Ответ 3:
const numbers = [10, 15, 20, 25, 30]; const result = numbers .map(num => num + 5) // [15, 20, 25, 30, 35] .filter(num => num > 20) // [25, 30, 35] .reduce((sum, num) => sum + num, 0); console.log(result); // 25 + 30 + 35 = 90
Стрелочные функции это мощный инструмент, который делает код чище и решает проблемы с контекстом this. Их нельзя использовать везде, например в методах объектов, где нужно обращаться к this самого объекта. Практикуйтесь, экспериментируйте и скоро вы будете применять их автоматически.
Полный курс по JavaScript для начинающих — https://max-gabov.ru/javascript-dlya-nachinaushih
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


