在 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 是的,闭包(在f
和i
之间)会有所不同,因为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 循环中声明的逗号运算符的主要内容,如果未能解决你的问题,请参考以下文章