3

假设您的浏览器同时支持标记函数声明块语句,那么浏览器确定以下是具有名为L函数的属性的对象F还是包含F标记为函数的块的标准方式/方法是什么L

{
    L: function F(){}
}

例如

为了公开我的意思,这里是上述代码的两个不同副本,它们被修改为将其公开为数组和函数:

document.body.textContent = typeof( () => {
    L: function F(){}
} )

在上面的代码中,浏览器识别出箭头函数符号并确定它是一个块语句。然而,

document.body.textContent = typeof {
    L: function F(){}
}

上面的代码让浏览器认为它是一个对象,它被写成一个对象字面量,索引L是函数F

4

2 回答 2

3

您可以将问题简化为:浏览器如何知道是否{启动以及何时启动对象字面量

对此的回答是,如果 JS 引擎{出现在语句位置,则将其视为块的开始;如果出现在表达式位置,则将其视为对象字面量的开始。

这就是为什么你必须在它们出现在语句位置时添加括号 ( ()){}但你想要一个对象。

带标签的函数声明的引入根本不会改变情况,因为情况已经很模糊:

{
  foo: 42
}

再次查看规范,实际上指出了这种歧义:

ExpressionStatement不能以 U+007B(左大括号)开头,因为这可能会使它与Block模棱两可

(语法也反映了这一点)

于 2017-06-15T23:01:20.930 回答
1

嗯......我认为:

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”索引的对象

于 2017-06-15T21:13:57.390 回答