Основываясь на своем опыте и информации в Why use named function expressions? и kangax.github.io: Named function expressions, то ясно, почему два примере ниже результата в данном выходе:Идентификатор объема сокращенной методы синтаксиса определения
Пример 1:
var f = function foo() {
console.log(foo);
}
console.log(typeof foo === "undefined"); // true
console.log(typeof f !== "undefined"); // true
console.log(f.name); // foo
Пример 2:
var obj = {
fooA: function foo() {
console.log('fooA -> ' + foo.toString());
},
fooB: function foo() {
console.log('fooB -> ' + foo.toString());
}
}
obj.fooA(); // the source of fooA
obj.fooB(); // the source of fooB
console.log(typeof foo === "undefined"); // true
В у Я пытаюсь выяснить, почему идентификатор не доступен для объема заключающего в следующем примере:
var obj = {
foo() {
console.log(typeof foo === "undefined"); // true
}
}
obj.foo();
console.log(obj.foo.name); // foo
Я предполагаю, что это где-то определенно, но информация об этом, кажется, распространилась по всем specs. Единственное четкое заявление я нашел на MDN: Method definitions:
Примечание: сокращенная синтаксис использует указанную функцию вместо анонимных функций (как в ... обув: функция() {} ...). Именованные функции можно вызывать из тела функции (это невозможно для анонимной функции, так как для ссылки нет идентификатора). Для получения дополнительной информации см. Функцию.
Но по моему варианту это противоречит наблюдению, поскольку он говорит, что такая функция является именованной функцией, и поэтому она должна быть доступна из тела функции.
Функция имеет имя, потому что obj.foo.name
является foo
, но foo
недоступен изнутри.
Является ли наблюдаемое поведение правильным в отношении спецификаций, и где это определено в спецификациях?
Благодарим вас за отзыв. Я подробно рассмотрю главу 14. Его меньше о том, что я хочу самостоятельно ссылаться на себя, но больше об этом пишу модуль для esformatter для рефакторинга кода, поэтому я хочу быть уверенным в этом. –
Мне нужно привыкнуть, что 'foo: function() {...}' приведет к тому, что 'foo.name' будет' foo', но, похоже, является логическим шагом для обеспечения согласованности всех представлений. –