gpt4 book ai didi

作为对象键的函数与 block 中标记的函数之间的 Javascript 语法冲突

转载 作者:行者123 更新时间:2023-11-29 19:03:44 24 4
gpt4 key购买 nike

假设您的浏览器同时支持 labeled function declarationsblock statements , 浏览器确定以下是具有名为 L 的属性的对象是函数 F 还是包含函数 的 block 的标准方式/方法是什么>F 标记为 L:

{
L: function F(){}
}

例如

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

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

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

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

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

最佳答案

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

答案是,如果 { 出现在语句位置,JS 引擎会将其视为 block 的开始,如果出现在表达式位置,则将其视为对象字面量的开始.

这就是为什么当 {} 出现在语句位置但您想要一个对象时,您必须在 {} 周围添加圆括号 (()) 的原因。

带标签的函数声明的引入根本没有改变情况,因为情况已经不明确了:

{
foo: 42
}

再看spec,其实指出了这个歧义:

An ExpressionStatement cannot start with a U+007B (LEFT CURLY BRACKET) because that might make it ambiguous with a Block.

(语法也反射(reflect)了这一点)

关于作为对象键的函数与 block 中标记的函数之间的 Javascript 语法冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44576954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com