Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在for循环中具有声明的逗号运算符_Javascript_For Loop_Declaration_Comma_Let - Fatal编程技术网

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

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与前

在下面的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
与前面的
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的一个特性?如果它是一个功能:在哪里指定?