所以我只是错误地在JS控制台中输入了一些东西,并且对它没有给我一个语法错误感到惊讶。我的问题:为什么这有效?
function foo(){
{
console.log('Valid Function');
}
}
foo();
我认为它会将内部{ ... }
解释为对象文字,但如果是这样的话,console.log就不会有效......那么......?
答案 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。