Функции в JavaScript могут при желании сами иметь имена:
- выдает 'f1', поскольку функция имеет имя при ее объявлении.
Код: Выделить всё
(function f1() {}).name - возвращает "", поскольку при объявлении функция не является именем.
Код: Выделить всё
(function () {}).name
- дает "f3", поскольку имя функции было определено путем просмотра именованной функции, назначенной f2 (которая на самом деле является просто "именем" и "указывает" на объект функции, созданный путем оценки выражения правой стороны), что само по себе является f3.
Код: Выделить всё
var f2 = function f3(); f2.name
Когда у вас есть безымянная функция в правой части (оцененное выражение), как в примере 2. выше, и вы немедленно*1 присваиваете ему имя, однако тогда функция будет иметь имя.
- дает "f4" (круглые круглые скобки здесь необязательны и включены только для облегчения чтения)
Код: Выделить всё
var f4 = (function() {}); f4.name
Теперь вы могли бы сказать, что JS всегда присваивает имя безымянной функции, если эта (безымянная функция) присваивается локальному имени, и это также применимо при работе с немедленным присвоением безымянной функции другим «именованным» вещам (например, «именованному отображению», т. е. «словарю»):
- дает "f5"
Код: Выделить всё
var o5 = {f5: function () {}}; o5.f5.name - выдает "" (возможно, потому что функция безымянна или потому, что она была присвоена именованному индексу с пустой строкой в словаре/объекте o6, думаю, мы никогда этого не узнаем)
Код: Выделить всё
var o6 = {['']: function (){}}; o6[''].name
Когда ваше безымянное выражение не может быть немедленно распознано синтаксическим анализатором (и фактически требуется вычисление II[N]F (немедленно вызываемая функция [nameless]), то присвоенное имя «локального имени» не передается автоматически вычисляемой безымянной функции справа:
- выдает "", несмотря на то, что безымянная функция вычисляемого выражения в правой части присваивается имени (
Код: Выделить всё
var f7 = (() => (function () {}))(); f7.name)Код: Выделить всё
f7
- дает ""
Код: Выделить всё
var o8 = {f8a: (() => (function () {}))()}; o8.f8a.name
- дает "" (опять же, возможно, потому, что функция безымянна, или потому, что она была присвоена именованному индексу с пустой строкой в словаре/объекте o6, мы тоже никогда не узнаем).
Код: Выделить всё
var o9 = {['']: (() => (function () {}))()}; o9[''].name
Подробнее здесь: https://stackoverflow.com/questions/798 ... javascript
Мобильная версия