Javascript块中作为对象键的函数和标记函数之间的语法冲突
假设您有一个同时支持和的浏览器,浏览器的标准方式/方法是什么来确定以下内容是一个名为Javascript块中作为对象键的函数和标记函数之间的语法冲突,javascript,javascript-objects,labeled-statements,Javascript,Javascript Objects,Labeled Statements,假设您有一个同时支持和的浏览器,浏览器的标准方式/方法是什么来确定以下内容是一个名为L的属性为functionF的对象,还是一个包含标记为L的functionF的块: { L: function F(){} } 例如。 为了公开我的意思,下面是上述代码的两个不同副本,它们经过修改以将其公开为数组和函数: document.body.textContent=typeof(()=>{ L:函数F(){} })嗯。。。我认为: if(1){ // the brackets here bel
L
的属性为functionF
的对象,还是一个包含标记为L
的functionF
的块:
{
L: function F(){}
}
例如。
为了公开我的意思,下面是上述代码的两个不同副本,它们经过修改以将其公开为数组和函数:
document.body.textContent=typeof(()=>{
L:函数F(){}
})嗯。。。我认为:
if(1){ // the brackets here belong to the if statement == block
L: function F(){}
}
在这里:
console.log({ // the brackets represent JSON (javascript object notation)
L: function F(){}
})
这确实是一个具有“L”索引的对象,您可以将问题简化为:浏览器如何知道{
是否启动块,以及何时启动对象文本
答案是,JS引擎会将{
视为块的开始(如果它出现在语句位置),并将其视为对象文本的开始(如果它出现在表达式位置)
这就是为什么当{}
出现在语句位置但需要对象时,必须在{}
周围添加括号(()
)
引入带标签的函数声明根本不会改变情况,因为情况已经不明确:
{
foo: 42
}
再次查看规范,实际上指出了这种模糊性:
a不能以U+007B(左曲括号)开头,因为这可能会使它与a不明确
(语法也反映了这一点)这并没有回答问题。您只是重述了示例。您似乎没有列出任何关于浏览器如何区分它们的信息(在第一段代码中).我确实同意上述答案更为详细。请在标准中的何处添加一条引文,以说明这一点。(我完全同意这一点,但我仍然对血腥的细节感到好奇)规范中没有这样写,但它遵循语法规则:。解析器只是尝试匹配规则。在顶部有一个脚本,它有一个脚本作为ScriptBody,它有一个语句列表,等等。箭头符号是一个例外。例如,使用箭头符号,if()=>3
创建一个返回3的函数,然后在逻辑上()=>{L:function F(){}
应该创建一个返回对象的函数。但不是这样,这意味着它必须更复杂。没有那么复杂,但确实,箭头函数有额外的规则:。主体可以是一个不以{
开头的表达式,也可以是{
后跟语句列表,后跟}
。