JS функции основы
Функция в JavaScript — объект первого класса, представляющий именованный или анонимный блок кода, который можно вызвать, передать как аргумент и вернуть из другой функции.
Зачем нужно
Функции — основа структурирования кода в JavaScript. Они позволяют избегать дублирования (DRY), инкапсулировать логику и создавать абстракции. Функции в JS являются объектами первого класса (first-class functions): их можно хранить в переменных, передавать как аргументы и возвращать из других функций — это основа функционального программирования, callback-паттерна и замыканий.
Где используется
- Reusable логика: валидация, форматирование, вычисления
- Callback-функции: обработчики событий,
setTimeout,Array.map - Замыкания: приватные переменные, фабрики, мемоизация
- Асинхронность: async-функции, Promise-обёртки
- Функциональное программирование:
map,filter,reduce, каррирование
Основной контент
Объявление функций
// Function Declaration — хоистится полностью, доступна до объявления
function greet(name) {
return `Привет, ${name}!`;
}
// Function Expression — не хоистится (только объявление переменной)
const greetExpr = function(name) {
return `Привет, ${name}!`;
};
// Arrow function — нет своего this, arguments; компактный синтаксис
const greetArrow = (name) => `Привет, ${name}!`;
const double = n => n * 2; // один параметр — скобки не обязательны
const getObj = () => ({ key: 'value' }); // объект нужно оборачивать в
Параметры функции
// Параметры по умолчанию (ES6)
function createUser(name, role = 'user', active = true) {
return { name, role, active };
}
createUser('Иван'); // { name: 'Иван', role: 'user', active: true }
createUser('Мария', 'admin'); // { name: 'Мария', role: 'admin', active: true }
// Rest-параметры — собирают оставшиеся аргументы в массив
function sum(first, ...rest) {
return rest.reduce((acc, n) => acc + n, first);
}
console.log(sum(1, 2, 3, 4)); // 10
// Деструктуризация в параметрах
function render({ title, body, tag = 'div' }) {
return `<${tag}><h1>${title}</h1><p>${body}</p></${tag}>`;
}
Функции как объекты первого класса
// Хранение в переменной / массиве / объекте
const operations = {
add: (a, b) => a + b,
sub: (a, b) => a - b,
mul: (a, b) => a * b,
};
console.log(operations.add(2, 3)); // 5
// Функция высшего порядка — принимает функцию как аргумент
function applyTwice(fn, value) {
return fn(fn(value));
}
console.log(applyTwice(x => x * 2, 3)); // 12
// Возврат функции из функции
function multiplier(factor) {
return (n) => n * factor;
}
const triple = multiplier(3);
console.log(triple(5)); // 15
Контекст вызова и this
// В обычной функции this зависит от контекста вызова
const obj = {
name: 'Объект',
getName: function {
return this.name; // this = obj при вызове obj.getName
}
};
// Стрелочная функция — this берётся из лексического окружения
function Timer() {
this.count = 0;
setInterval(() => {
this.count++; // this === Timer, а не глобальный объект
}, 1000);
}
// bind, call, apply — явное указание this
function greet(greeting) {
return `${greeting}, ${this.name}`;
}
const user = { name: 'Иван' };
console.log(greet.call(user, 'Привет')); // 'Привет, Иван'
console.log(greet.apply(user, ['Здравствуй'])); // 'Здравствуй, Иван'
const boundGreet = greet.bind(user);
console.log(boundGreet('Добрый день')); // 'Добрый день, Иван'
Чистые функции
// Чистая функция: нет побочных эффектов, результат зависит только от аргументов
const pureAdd = (a, b) => a + b;
// Нечистая функция: изменяет внешнее состояние
let total = 0;
function impureAdd(n) {
total += n; // побочный эффект
return total;
}
Частые ошибки
- Hoisting Function Expression:
const fn = function {}— нельзя вызвать до объявления, будет ReferenceError. - Arrow function и
this: стрелочная функция не имеет своегоthis— нельзя использовать как метод объекта или конструктор. argumentsнедоступен в стрелочных функциях: вместо него используйте rest-параметры...args.- Забыть
return: функция безreturnвозвращаетundefined. В методах объекта это частая скрытая ошибка.
Связанные темы
Ресурсы
🎓 Источник: Функции, стрелочные функции, контексты, замыкания
- 📅 2018-09-27 · YouTube · ID:
pn5myCmpV2U - Тезисы:
- Функция = объект первого класса: передаётся, возвращается, присваивается
- Математическая функция — преобразователь величины (область определения → область значений)
- Чистые функции — предсказуемы (sin, sort, uppercase)
- Побочные эффекты возникают из-за контекстов: функция видит идентификаторы окружения
- Функция не должна быть больше экрана; 30 строк — уже тяжело
- 4 способа объявить функцию: declaration, expression, lambda,
new Function fn.name— имя;fn.length— число объявленных аргументов (без rest/default)- Декомпозиция: вместе мелкие функции длиннее, но проще читать и переиспользовать
- Цитата: «Функция в JavaScript это так называемый объект первого класса. Он может передаваться как аргумент в другую функцию. Можно возвращать функцию как результат другой функции.»