Оператор запятой с объявлениями в цикле for

В следующем блоке кода 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();
}

Я не хочу менять масштабы. Я просто ищу синтаксическое средство для точного выражения созвездия масштаба, как указано в моем вопросе.

Есть ли причина, по которой вы хотите избежать назначения f в теле цикла?

kuzyn 20.03.2019 15:57

@kuzyn Да, замыкание (между f и i) будет другим, поскольку переменная i в for-блоке имеет другую область видимости, как переменная i в for (...; ...; ...). Хотя это не очевидно.

Min-Soo Pipefeet 20.03.2019 16:13

Я думаю, нам нужно увидеть реальный пример того, чего вы пытаетесь достичь здесь. Ваша упрощенная версия, очевидно, немного надуманная @Min-SooPipefeet

Liam 20.03.2019 16:14

@Liam Да, это абсолютно надумано, так как это просто исследование использования оператора запятой в for-цикле (а не стрелочных функций). Поэтому comma нельзя убирать из ключевых слов, а arrow-functions не добавлять.

Min-Soo Pipefeet 20.03.2019 16:16

Обратите внимание, что , здесь не оператор запятой, а разделитель между объявлениями нескольких переменных (как в обычном многострочном объявлении).

Bergi 20.03.2019 22:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение:

{
    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();
}

Да, круглые скобки делают это выражение фактическим оператором запятой. Кстати, вы должны добавить в свой ответ отказ от ответственности, что это абсолютно ужасный синтаксис и никогда не должен использоваться в реальном коде :-)

Bergi 20.03.2019 22:33

Кстати, альтернативой оператору запятой (лучше, чем фиктивная переменная) является использование IIFE: let i = (()=>{ f = …; return 'a'; })();

Bergi 20.03.2019 22:35

@Bergi Да, использование IIFE - лучший вариант, чем фиктивная переменная. Но все же гораздо страшнее, чем let i = (f = ...; 'a') :-)

Min-Soo Pipefeet 21.03.2019 09:46

Вся эта штука создания эффектов из недолговечной области инициализации головы цикла настолько ужасна, что все эти альтернативы мало что дают :-)

Bergi 21.03.2019 11:33

@ Берги Абсолютно! Мне они нужны были только для того, чтобы выяснить и утверждать, что на самом деле существует собственная "область инициализации головы цикла"! МОЙ БОГ! :-) - Это ошибка или особенность JS? А если фича: где она указана?

Min-Soo Pipefeet 21.03.2019 12:44

Другие вопросы по теме