JavaScript свойство Function.name

Определение и применение

JavaScript свойство name объекта Function соответствует имени функции, указанному при ее создании, либо выведенному из имени переменной или свойства. Без такого имени результат может быть пустой строкой. Имя anonymous получают функции, созданные конструктором Function. Свойство name доступно только для чтения.

Присваивание не меняет стандартное свойство name, но его можно переопределить через Object.defineProperty(), поскольку configurable (разрешение переопределения) равно true. Имя служит для диагностики и не гарантирует уникальность.

Создание функции из строки показано статическим листингом: учебный редактор запрещает динамическую компиляцию кода.

JavaScript
new Function('return 1').name; // "anonymous"

Атрибуты свойства: writable разрешает присваивание, enumerable определяет участие в перечислении свойств, configurable разрешает удаление и переопределение.

name: справочные сведения
Атрибут Значение
writable false
enumerable false
configurable true*

* - в нестандартных реализациях (до ECMAScript 2015) атрибут configurable имел значение false.

Подробную информацию о дескрипторах свойств вы можете получить в описании метода defineProperty(), который позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.

Поддержка браузерами

Спецификация: ecma262

Поддерживается во всех основных браузерах с 2016 года.

Показать браузеры
Совместимостьjavascript.builtins.Function.name
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
name✓15✓14✓1✓10.5✓6✓18✓4✓11✓6✓1.0✓4.4✓6
Configurable: true✓43✓14✓38✓30✓10✓43✓38✓30✓10✓4.0✓43✓10
Inferred names on anonymous functions✓51✓79

Версия 79 выпущена в 2020 г.

Версия 14 выпущена в 2016 г. — Удалено в 79; Частичная поддержка

Примечание MDN (англ.)

Names for functions defined in a dictionary are properly assigned; however, anonymous functions defined on a var/let variable assignment have blank names.

✓53✓38✓10✓51✓53✓41✓10✓5.0✓51✓10

поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31

JavaScript синтаксис:

JavaScript
func.name

Спецификация

ECMAScript — Function: name.

Примеры, попробуйте сами

Откуда функция получает имя

Переименуйте переменную и именованную функцию. Сравните явно заданное, выведенное и пустое имя.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
const named = function myFunc() {}
const object = { method() {} }
console.log(named.name) // myFunc
console.log(object.method.name) // method

// Имя выводится из переменной; несвязанное выражение остаётся без имени.
const inferred = () => {}
console.log(inferred.name) // inferred
console.log(function () {}.name === '') // true

Функции на которых вызывается метод bind() возвращают значение имени функции "bound " + имя функции :

Почему bind() добавляет bound к имени

Измените имя исходной функции и посмотрите на имя функции после bind().

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
const original = function myFunc() {}
console.log(original.bind(null).name) // bound myFunc

При использовании свойств метода доступа get и set у объекта при получении имен этих функций через объект дескриптор (с использованием метода getOwnPropertyDescriptor()) к имени этих функций будет добавлено значение "get" или "set":

Как называются геттеры и сеттеры

Переименуйте свойство value в объекте и в запросе дескриптора. Сравните имена get и set.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
const object = {
    get value() {
        return 1
    },
    set value(next) {},
}
const descriptor = Object.getOwnPropertyDescriptor(object, 'value')
console.log(descriptor.get.name) // get value
console.log(descriptor.set.name) // set value

Если символ используется в качестве имени функции и имеет описание, которые было задано при создании, то имя функции будет соответствовать этому описанию, помещенному в квадратные скобки, иначе будет возвращена пустая строка:

Как символьный ключ определяет имя метода

Измените описание Symbol и сравните имя метода с ключом без описания.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
const first = Symbol('first')
const empty = Symbol()
const object = { [first]() {}, [empty]() {} }
console.log(object[first].name) // [first]
console.log(object[empty].name) // Пустая строка.