В следующем блоке кода JavaScript я НЕ хочу объявлять новую функцию f в for-области, а просто присвоить () => i ранее объявленной let f, тем самым создавая замыкание для объявленной и определенной переменной for-области i.
К сожалению, код приводит к Type Error: f is not a function, потому что f = () => i интерпретируется как let f = () => i:
{
let f;
for (let i = 'a', f = () => i; i == 'a'; ) {
i = 'b';
}
f();
}
Как в for-цикле отделить f = () => i от прецедента let i = 'a'?
Если его заключить в круглые скобки, получится Syntax Error:
{
let f;
for ((let i = 'a'), f = () => i; i == 'a'; ) {
i = 'b';
}
f();
}
Я не хочу менять масштабы. Я просто ищу синтаксическое средство для точного выражения созвездия масштаба, как указано в моем вопросе.
@kuzyn Да, замыкание (между f и i) будет другим, поскольку переменная i в for-блоке имеет другую область видимости, как переменная i в for (...; ...; ...). Хотя это не очевидно.
Я думаю, нам нужно увидеть реальный пример того, чего вы пытаетесь достичь здесь. Ваша упрощенная версия, очевидно, немного надуманная @Min-SooPipefeet
@Liam Да, это абсолютно надумано, так как это просто исследование использования оператора запятой в for-цикле (а не стрелочных функций). Поэтому comma нельзя убирать из ключевых слов, а arrow-functions не добавлять.
Обратите внимание, что , здесь не оператор запятой, а разделитель между объявлениями нескольких переменных (как в обычном многострочном объявлении).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я нашел решение:
{
let f;
for (let i = (f = () => i, 'a'); i == 'a'; ) {
i = 'b';
}
f();
}
Или с дополнительным манекеном-помощником:
{
let f;
for (let i = 'a', dummy = (f = () => i, 'ignore'); i == 'a'; ) {
i = 'b';
}
f();
}
Да, круглые скобки делают это выражение фактическим оператором запятой. Кстати, вы должны добавить в свой ответ отказ от ответственности, что это абсолютно ужасный синтаксис и никогда не должен использоваться в реальном коде :-)
Кстати, альтернативой оператору запятой (лучше, чем фиктивная переменная) является использование IIFE: let i = (()=>{ f = …; return 'a'; })();
@Bergi Да, использование IIFE - лучший вариант, чем фиктивная переменная. Но все же гораздо страшнее, чем let i = (f = ...; 'a') :-)
Вся эта штука создания эффектов из недолговечной области инициализации головы цикла настолько ужасна, что все эти альтернативы мало что дают :-)
@ Берги Абсолютно! Мне они нужны были только для того, чтобы выяснить и утверждать, что на самом деле существует собственная "область инициализации головы цикла"! МОЙ БОГ! :-) - Это ошибка или особенность JS? А если фича: где она указана?
Есть ли причина, по которой вы хотите избежать назначения f в теле цикла?