Javascript 为什么这个JS语法有效(额外的大括号)?

Javascript 为什么这个JS语法有效(额外的大括号)?,javascript,Javascript,因此,我只是在JS控制台中错误地键入了一些内容,并惊讶地发现它没有给我一个语法错误。我的问题:为什么这是有效的 function foo(){ { console.log('Valid Function'); } } foo(); 我假设它会将内部{…}解释为一个对象文本,但如果是这种情况,console.log将无效。。。所以…?这是一个匿名代码块。例如: {var x=5; alert(x);} 此外,为了澄清您的问题,“作为一个对象文字,但如果是这样的话

因此,我只是在JS控制台中错误地键入了一些内容,并惊讶地发现它没有给我一个语法错误。我的问题:为什么这是有效的

function foo(){
    {
        console.log('Valid Function');
    }
}
foo();

我假设它会将内部
{…}
解释为一个对象文本,但如果是这种情况,console.log将无效。。。所以…?

这是一个匿名代码块。例如:

{var x=5; alert(x);}
此外,为了澄清您的问题,“作为一个对象文字,但如果是这样的话,console.log将无效…所以…”

它不是一个物体。但是,请注意,如果您有一个
键:
或其他东西,它可以被解释为一个对象并仍然有效,因为不返回任何内容的语句将被解释为
未定义的

({1:console.log('test')})
结果(也打印出“测试”):


根据此javascript 2.0语法:

此处定义了一个对象文字:

ObjectLiteral {}{FieldList}

这意味着它必须为空或包含一个有效的字段列表,该列表必须有一个空冒号来分隔键和值

因此,您的块被解释为一个“语句”,它周围可以有大括号


许多c语法语言都有任意大括号来对语句进行分组,但与大多数语言不同,JavaScript并没有限制在该块中声明的变量的变量范围。这意味着额外的牙套实际上没有多大用途,几乎从未使用过,这可能就是你没想到它会起作用的原因

大括号指定一个代码块。块是有效语句,可以出现在任何允许使用语句的地方。参见第220页。

嗯,这如何回答我的问题?我很好奇为什么这是有效的:
{{}
,或者扩展:
1;{2;{3;}4;}5;。基本上,所有额外的大括号似乎都被忽略了,我想知道这是不是真的——为什么,如果它们被解释为什么?你可以在
{
}
中包装任何一组语句序列。它通常没有影响(可能对作用域有影响)。JS没有块作用域,这就是为什么这个有效性让我困惑的原因
Object
1: undefined
__proto__: Object