Ответ 1
Я не понимаю, почему эти примеры не хороши
Поскольку инициализаторы по умолчанию не оцениваются в родительской области, а скорее внутри области функций. Сами параметры уже находятся в области видимости, поэтому вы можете сделать что-то вроде
(function(a = 2, b = a) { console.log(b); }());
Может кто-нибудь, пожалуйста, укажите мне, чтобы указать в спецификации, которая могла бы прояснить это?
Соответствующий раздел §9.2.12 ФункцияDeclarationInstantiation.
Я должен сказать, что спецификация довольно трудно понять.
Да, но это написано для разработчиков двигателей не для программистов. Однако пояснительная записка в основном подтверждает ваше понимание оптимизации
Если формальные параметры функций не включают инициализаторы значения по умолчанию, то объявления тела создаются в той же записи среды, что и параметры. Если существуют инициализаторы параметров значения по умолчанию, для деклараций тела создается вторая запись окружения.
Ваши примеры в основном desugar для
(function() {
let a = arguments[0] !== undefined ? arguments[0] : b,
// ^ clearly a ReferenceError
b = arguments[1] !== undefined ? arguments[1] : 1;
{
}
})();
(function() {
let c = 1;
return (function() {
let a = arguments[0] !== undefined ? arguments[0] : c;
// ^ works as you'd think
{
return a === 1;
}
})();
})();
(function() {
let a = 1;
(function() {
let a = arguments[0] !== undefined ? arguments[0] : a;
// ^ again clearly a ReferenceError
{
}
})();
})();
(function() {
let b = 1;
(function() {
let a = arguments[0] !== undefined ? arguments[0] : b,
// ^ still a ReferenceError
b = arguments[1] !== undefined ? arguments[1] : 2;
{
}
})();
})();
(function() {
let a = arguments[0] !== undefined ? arguments[0] : () => b,
// ^ works indeed
b = arguments[1] !== undefined ? arguments[1] : 2;
{
return a() === 2;
}
})();