Javascript 在for循环中具有声明的逗号运算符
在下面的JavaScript代码块中,我不想在Javascript 在for循环中具有声明的逗号运算符,javascript,for-loop,declaration,comma,let,Javascript,For Loop,Declaration,Comma,Let,在下面的JavaScript代码块中,我不想在for-作用域中声明一个新函数f,只想将()=>I分配给先前声明的let f,从而为作用域声明和定义的变量创建一个闭包 不幸的是,代码导致类型错误:f不是函数,因为f=()=>i被解释为let f=()=>i: { let f; for (let i = 'a', f = () => i; i == 'a'; ) { i = 'b'; } f(); } 在for-循环中,如何将f=()=>I与前
for
-作用域中声明一个新函数f
,只想将()=>I
分配给先前声明的let f
,从而为作用域声明和定义的变量创建一个闭包
不幸的是,代码导致类型错误:f不是函数,因为f=()=>i
被解释为let f=()=>i
:
{
let f;
for (let i = 'a', f = () => i; i == 'a'; ) {
i = 'b';
}
f();
}
在for
-循环中,如何将f=()=>I
与前面的let I='a'
分开
将其放在括号中会导致语法错误
:
{
let f;
for ((let i = 'a'), f = () => i; i == 'a'; ) {
i = 'b';
}
f();
}
我不想改变范围。我只是想找一个语法上的意思来表达我问题中给出的范围星座。我找到了解决方案:
{
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();
}
有什么原因不想在循环体中指定f吗?@kuzyn是的,闭包(在f
和i
之间)会有所不同,因为for
-块中的变量i
与for(…;;…)
中的变量i
有另一个作用域。虽然这并不明显,但我认为我们需要看到一个实际的例子,说明你们在这里试图实现的目标。显然你的简化版有点做作@Min-SooPipefeet@Liam是的,这完全是人为的,因为它只是一项关于在
-循环的中使用逗号运算符的研究(而不是关于箭头函数)。这就是为什么不应从关键字中删除逗号
,也不应添加箭头函数
。请注意,,
在这里不是逗号运算符,它是多个变量声明之间的分隔符(就像在普通的多行声明中一样)。是,括号使此表达式具有实际的逗号运算符。顺便说一句,你应该在你的回答中添加一个免责声明,这是绝对可怕的语法,不应该在实际代码中使用:-)顺便说一句,逗号运算符的替代方法(比伪变量更好)是使用IIFE:let i=(()=>{f=…;return'a';})(代码>@Bergi是的,使用IIFE比伪变量更好。但是仍然比让i=(f=…;'a')
:-)更可怕的是,在短寿命循环头初始化范围内执行效果的整个过程是如此可怕,以至于所有这些替代方案都没有给出太多:-)@Bergi绝对!我只需要它们来发现并断言实际上有一个自己的“循环头初始化范围”!天哪!:-)-这是一个bug还是JS的一个特性?如果它是一个功能:在哪里指定?