name - это свойство функции, которое хранит её имя в виде строки.
Если говорить просто, через name можно узнать, как JavaScript видит имя конкретной функции.
Синтаксис
Базовая запись выглядит так:
functionName.name;
Результатом будет строка.
function greet() {}
console.log(greet.name); // "greet"
Что возвращает name
Если функция объявлена обычным способом, её имя берётся прямо из объявления.
function greet() {}
console.log(greet.name); // "greet"
Это самый понятный и частый случай.
name у функции, записанной в переменную
Современный JavaScript умеет автоматически определять имя даже у функции, которая записана в переменную.
const sayHi = function () {};
console.log(sayHi.name); // "sayHi"
Хотя сама функция здесь написана без имени, JavaScript часто выводит его из имени переменной.
name у стрелочной функции
Со стрелочными функциями работает похожая идея.
const sum = () => {};
console.log(sum.name); // "sum"
То есть имя может быть определено автоматически и для стрелочной функции, если она присвоена переменной.
name у метода объекта
У метода объекта тоже есть имя.
const user = {
showName() {},
};
console.log(user.showName.name); // "showName"
Это полезно помнить: метод объекта всё равно остаётся функцией, а значит у него тоже есть свойство name.
У анонимной функции имя может быть пустым
Если функция нигде не получила имя, name может оказаться пустой строкой.
console.log((function () {}).name); // ""
console.log((() => {}).name); // ""
Поэтому не стоит ожидать, что у любой функции обязательно будет красивое и понятное имя.
name у результата bind()
После bind() создаётся новая функция, и её имя обычно получает префикс bound .
function greet() {}
const boundGreet = greet.bind(null);
console.log(boundGreet.name); // "bound greet"
Это бывает полезно при отладке, когда нужно понять, что перед вами именно привязанная функция.
Для чего это полезно
Свойство name чаще всего используют не для основной логики приложения, а для:
- отладки
- логирования
- вывода служебной информации
- чтения стека вызовов и ошибок
Пример:
function loadData() {
console.log(`Запущена функция: ${loadData.name}`);
}
loadData(); // "Запущена функция: loadData"
Для учебных примеров и отладки это вполне удобно.
name не стоит использовать как основу важной логики
Хотя свойство name выглядит удобным, лучше не строить на нём критически важное поведение приложения.
Например, такой код считается хрупким:
function saveData() {}
if (saveData.name === "saveData") {
console.log("Совпало");
}
Почему это не лучший подход:
- имя функции можно поменять при рефакторинге
- в разных сценариях имя может определяться по-разному
- после сборки или преобразований кода результат может быть не таким, как вы ожидали
Поэтому name лучше воспринимать как вспомогательное свойство, а не как надёжный способ управлять логикой программы.
Можно ли изменить name
Обычным присваиванием - обычно нет.
function greet() {}
greet.name = "test";
console.log(greet.name); // "greet"
Для базового понимания достаточно запомнить: name обычно читают, а не меняют.
name и свойство name у объектов - это не одно и то же
Эту вещь легко перепутать.
const user = {
name: "Анна",
showName() {},
};
console.log(user.name); // "Анна"
console.log(user.showName.name); // "showName"
Здесь:
user.name- обычное свойство объектаuser.showName.name- имя функцииshowName
Это разные значения и разные смыслы.
Частые ошибки
Думать, что name есть только у function declaration
На практике JavaScript часто определяет имя и у функций, записанных в переменные, и у стрелочных функций.
Ожидать, что у любой функции всегда будет полезное имя
У анонимной функции name может быть пустой строкой.
Использовать name как надёжную основу логики
Для отладки это удобно, но для важной логики приложения такой подход слишком хрупкий.
Пытаться переименовать функцию через обычное присваивание
function greet() {}
greet.name = "test";
Обычно это не меняет имя функции.
Путать name функции и обычное свойство объекта name
const user = {
name: "Анна",
showName() {},
};
user.name и user.showName.name - это не одно и то же.
Быстрая памятка
nameхранит имя функции в виде строки- у обычной объявленной функции
nameсовпадает с её именем - у функций в переменных и у стрелочных функций имя часто определяется автоматически
- у анонимной функции
nameможет быть пустой строкой - после
bind()имя обычно получает префиксbound nameполезен для отладки и служебной информации- на
nameлучше не завязывать важную логику приложения
Коротко
name в JavaScript нужен, чтобы получить имя функции в виде строки. Главное, что стоит запомнить: это удобное свойство для отладки и понимания кода, но не самый надёжный инструмент для важной логики программы.