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

时间:2011-05-27 02:51:08

标签: javascript

所以我只是错误地在JS控制台中输入了一些东西,并且对它没有给我一个语法错误感到惊讶。我的问题:为什么这有效?

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

我认为它会将内部{ ... }解释为对象文字,但如果是这样的话,console.log就不会有效......那么......?

3 个答案:

答案 0 :(得分:3)

这是匿名代码块。例如:

{var x=5; alert(x);}

此外,为了澄清你的问题“成为一个对象文字,但如果是这样的话,console.log将无效......那么......?”

这不是一个对象。但是,请注意,如果您有key:或其他内容,可以被解释为对象并且仍然有效,因为不返回任何内容的语句将被解释为undefined

({1:console.log('test')})

结果(也打印出'test'):

Object
1: undefined
__proto__: Object

答案 1 :(得分:3)

根据这个javascript 2.0语法:

http://www.mozilla.org/js/language/js20-2000-07/formal/parser-grammar.rtf

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

ObjectLiteral     {} | {FieldList}

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

因此,您的区块被解释为“语句”,其中可以包含大括号。

许多c语法语言都有任意括号来组合语句,但与大多数语法不同,JavaScript并不限制在该块中声明的那些变量的变量范围。这意味着额外的牙箍并没有太多的用途,几乎从未使用过,这可能就是为什么你没想到它会起作用!

答案 2 :(得分:2)

大括号指定一段代码。块是有效语句,可以出现在允许语句的任何位置。请参阅第{220页的http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf