name у функции в JavaScript

name - это свойство функции, в котором хранится ее имя.

function sayHello() {
  console.log('Привет!');
}

console.log(sayHello.name);

Результат:

sayHello

Свойство name не вызывает функцию. Оно просто возвращает строку с именем функции.

Что такое name

В JavaScript функция - это значение. У этого значения есть свои свойства, и одно из них - name.

function getUser() {
  return 'Анна';
}

console.log(getUser.name);

Результат:

getUser

Так можно узнать, как называется функция.

Function Declaration

У функции, объявленной через Function Declaration, имя берется из объявления.

function calculatePrice() {
  return 1000;
}

console.log(calculatePrice.name);

Результат:

calculatePrice

Здесь имя функции - calculatePrice.

Function Expression

Если функция записана в переменную, JavaScript часто берет имя из этой переменной.

let showMessage = function () {
  console.log('Сообщение');
};

console.log(showMessage.name);

Результат:

showMessage

Хотя сама функция записана без имени, JavaScript понимает, что она лежит в переменной showMessage.

Функция может иметь и свое имя внутри выражения.

let showMessage = function message() {
  console.log('Сообщение');
};

console.log(showMessage.name);

Результат:

message

В этом случае свойство name вернет имя message, потому что оно указано у самой функции.

Стрелочные функции

У стрелочной функции тоже может быть свойство name.

let double = (number) => number * 2;

console.log(double.name);

Результат:

double

Имя взялось из переменной double.

Анонимные функции

Если анонимная функция никуда не записана, имени у нее может не быть.

console.log((function () {}).name);

Результат:

В консоль выведется пустая строка.

На практике такие функции часто встречаются как callback-функции.

setTimeout(function () {
  console.log('Готово');
}, 1000);

В этом примере имя функции обычно не важно, потому что мы не обращаемся к ней отдельно.

name после bind()

Если создать новую функцию через bind(), ее имя начинается со слова bound.

function showName() {
  console.log(this.name);
}

let user = {
  name: 'Анна'
};

let boundShowName = showName.bind(user);

console.log(boundShowName.name);

Результат:

bound showName

Так JavaScript показывает, что это функция, полученная через bind().

Где используется name

Свойство name чаще всего полезно для отладки, логов и сообщений об ошибках.

function validateEmail(email) {
  return email.includes('@');
}

console.log('Запущена функция: ' + validateEmail.name);

Результат:

Запущена функция: validateEmail

Но строить основную логику программы на name обычно не стоит. Имя функции - это скорее служебная информация.

Итого

1. name возвращает имя функции строкой.

2. У Function Declaration имя берется из объявления функции.

3. У Function Expression и стрелочных функций имя часто берется из переменной.

4. У анонимной функции без переменной имя может быть пустой строкой.

5. После bind() имя функции начинается с bound.