Как и в ES2015 (ES6), функции имеют собственные имена (включая официальное свойство name
), а имена назначаются, когда функция создается разными способами в дополнение к очевидному объявлению функции и названному выражению функции, такие как присвоение переменных (имя функции задано как имя переменной), назначение свойств объекта (имя функции задано как имя свойства), даже значения по умолчанию для параметров функции (имя функции задано на имя параметра). Но присваивание свойства существующему объекту (например, не в инициализаторе объекта) не присваивает этому имени свойства функции. Почему нет? Разумеется, должна быть определенная причина, в которой это нежелательно/возможно. Что это было?
Чтобы быть ясным: я не спрашиваю, как обойти это. Я спрашиваю, что мешает этому, казалось бы, очевидному случаю, обрабатываться, когда так много других (включая значения параметров по умолчанию!). Должна быть веская причина.
Пожалуйста, не спекулируйте или не теоретизируйте. У TC39 была причина не включать его. Меня интересует, что это за причина. Я прошел через заметки совещания TC39, но еще не нашел его. Самое близкое, что я нашел до сих пор, - это Аллен Вирфс-Брок отвечая на вопрос Берги, чтобы сказать, что не было никакого консенсуса в отношении того, чтобы сделать это для этой формы из-за "различных возражений", но к сожалению, он не сказал, каковы эти возражения.
Подробнее:
Все следующие присваивают функции foo
функции в совместимом браузере:
// Requires a compliant browser
// Assigning to a variable or constant...
// ...whether in the initializer...
{
let foo = function() { };
console.log("1:", foo.name); // "foo"
}
{
const foo = function() { };
console.log("2:", foo.name); // "foo"
}
// ...or later...
{
let foo;
foo = function() { };
console.log("3:", foo.name); // "foo"
}
// As an initializer for an object property
{
const obj = {
foo: function() { }
};
console.log("4:", obj.foo.name); // "foo"
}
// Or as a method
{
const obj = {
foo() { }
};
console.log("5:", obj.foo.name); // "foo"
}
// Even if it a computed property name
{
let name = "f";
const obj = {
[name + "o" + "o"]() { }
};
console.log("6:", obj.foo.name); // "foo"
}
// As a default value for a parameter
(function(foo = function() { }) {
console.log("7:", foo.name); // "foo"
})();
// ...and a bunch of others