在 for 循环中声明的逗号运算符

Posted

技术标签:

【中文标题】在 for 循环中声明的逗号运算符【英文标题】:comma operator with declarations in a for-loop 【发布时间】:2019-08-11 07:44:21 【问题描述】:

在下面的 javascript 代码块中,我不想在 for 范围内声明一个新函数 f,而只是将 () => i 分配给先前声明的 let f,从而为 @ 创建一个闭包987654325@-scoped 声明和定义变量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-loop 中,如何将f = () => i 与先例let i = 'a' 分开?

将它放在括号中会产生Syntax Error


    let f;
    for ((let i = 'a'), f = () => i; i == 'a'; ) 
        i = 'b';
    
    f();

我不想更改范围。我只是在寻找一种句法意思来表达我的问题中给出的确切范围星座。

【问题讨论】:

有什么理由要避免在循环体中分配 f ? @kuzyn 是的,闭包(在fi 之间)会有所不同,因为for 块中的变量i 具有另一个范围作为变量i for (...; ...; ...)。虽然这并不明显。 我认为我们需要查看一个实际示例,说明您在此处尝试实现的目标。你显然简化版有点做作@Min-SooPipefeet @Liam 是的,这绝对是人为的,因为它只是关于在for-loop 中使用逗号运算符的研究(而不是关于箭头函数)。这就是为什么不应该从关键字中删除comma,也不应该添加arrow-functions 请注意,, 不是这里的逗号运算符,它是多个变量声明之间的分隔符(就像在普通的多行声明中一样)。 【参考方案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();

【讨论】:

是的,括号使这个表达式有一个实际的逗号运算符。顺便说一句,你应该在你的答案中添加一个免责声明,这是绝对可怕的语法,不应该在实际代码中使用:-) 顺便说一句,逗号运算符(比虚拟变量更好)的替代方法是使用 IIFE:let i = (()=> f = …; return 'a'; )(); @Bergi 是的,使用 IIFE 是比虚拟变量更好的选择。但仍然比let i = (f = ...; 'a') 可怕得多:-) 在短暂的循环头初始化范围内做效果的整个事情是如此可怕,以至于所有这些替代方案都没有提供太多:-) @Bergi 绝对!我只需要他们找出并断言实际上有一个自己的“循环头初始化范围”!我的天啊! :-) - 这是一个错误还是 JS 的一个特性?如果它是一个特性:它在哪里指定?

以上是关于在 for 循环中声明的逗号运算符的主要内容,如果未能解决你的问题,请参考以下文章

FOR循环中的逗号运算符,它是如何工作的?

逗号运算符do while循环嵌套循环数组简介

用逗号运算符做 while ( , ) ,这可能吗?

如何提高循环效率

C编程-while循环中的逗号运算符[重复]

JavaScript 逗号运算符