大括号在JavaScript中做什么?

大括号在JavaScript中做什么?,javascript,Javascript,我读了这句话,用的是口若悬河的JavaScript,我想说清楚一点 …大括号在JavaScript中有两种含义。在语句开始时,它们启动语句块。在任何其他位置,它们描述一个对象。幸运的是,用大括号对象开始语句几乎没有用,而且 所以,让我们假设一个。。。。。“if语句”创建要执行的语句块,但在函数调用(作为参数)或变量赋值中出现的大括号将成为对象文字 是这样吗?其他的情况是什么?我不确定我是否理解大括号何时捆绑语句以及何时将对象描述为对象文字的规则。 作为职能机构 其中,语句中的第一项是对象文字 作

我读了这句话,用的是口若悬河的JavaScript,我想说清楚一点

…大括号在JavaScript中有两种含义。在语句开始时,它们启动语句块。在任何其他位置,它们描述一个对象。幸运的是,用大括号对象开始语句几乎没有用,而且

所以,让我们假设一个。。。。。“if语句”创建要执行的语句块,但在函数调用(作为参数)或变量赋值中出现的大括号将成为对象文字

是这样吗?其他的情况是什么?我不确定我是否理解大括号何时捆绑语句以及何时将对象描述为对象文字的规则。

作为职能机构 其中,语句中的第一项是对象文字 作为非结构化赋值 注意-这有很多表格,所以我不会全部介绍,(谢谢RobG)

这是如何解释的 您可以假设所有JS代码都在某个
{}
块中。因此,代码的开头紧跟在
{
始终之后

在需要值的地方,
{}
并不意味着函数体。在语句的开头,这是不明确的,因为可以有如下匿名代码块:

var x = 1;
{
    var x = x+2;
    // x = 3
}
// x = 3 (!)
这是一种过时的C风格语法,它会影响作用域,但在JS中测试它时,它似乎没有这种效果,因此除了识别代码块之外,它是一种毫无用处的语法。如果您想要这种行为,您需要这样做:

var x = 1;
(()=>{
    var x = x+2;
    // x = 3
})()
// x = 1
如果我们在某个语句中首先需要一个对象,我们需要向JS说明我们需要一个值。这就是为什么我们使用
({})
而不是
{}
,因为前者在paren中是一个明确的对象文本


更简单的解释 与其检查
{}
何时被解析为值,不如看看它何时没有被解析为值。通常有两种情况下,我们不将
{}
视为对象文本:作为函数体或作为语句组(我自己的术语)

考虑一般控制语句-
if
for
while
with
等。这些都可以*以完全避免
{}
的方式使用。在这方面,
{}
应被视为语句组,因此使用该术语

if (x) x++; else x--;
if (x) {x++;} else {x--;}
{if (x) {x++;} else {x--;}}
*注意:
switch
是一个例外,
switch(1);
给出了一个错误
SyntaxError:missing{在开关体之前

使用这个规则,我们就可以理解为什么我们必须使用
()
来表示一个对象文字,如果它是一个语句的开始-我们不能在
()
中启动一个语句,因此您也不能在那里启动一个语句组,只留下一个选项(对象文字或相关语法)

这就留下了功能体

职能机构

首先,考虑函数声明语句:

function f () {}
它不需要分号(
)。这意味着整个语句都是一条语句。这就解释了为什么下面给出了第一种形式而不是第二种形式的语法错误:

function(){return 1;}(); // error: function statement requires name
var x = function(){return 1;}(); // fine
这是因为第一个语句被解析为语句,函数声明语句不能是匿名的。但是第二个语句在值上下文中,并被视为匿名的。这种情况与对象文本的情况相同,如果它可以是语句,它就不能是值,但如果我们已经深入到值领域,它就必须是值。

除了一个例外,
=>
符号的解析方式与
函数的解析方式相同。
()=>{}
形式是相同的,但实际上是不同的,因为这种类型的函数不能有
这个
对象-它不能是对象方法(对它没有多大意义),也不能构造新对象(它没有原型)和其他一些怪癖,否则很容易看出它与
function(){}
的相同之处

然而,
()=>…
有点不同。它被视为
()=>{return…}
。但是,如果没有显式的
}
来完成return语句,语法会贪婪地捕获将进行解析的最大表达式(不一定有效)。例如:

()=>1; // statement; = function that returns "1"
()=>1(); // statement; = function that returns "1()"
(()=>1()); // TypeError: 1 is not a function
(()=>1)(); // what was intended in above (you'd hope)

当它们在语句上下文中使用时-它们是语句、对象文本或解构文本。什么是“语句上下文”?程序中的一切不是由语句和表达式组成的吗?
var a={};
严格来说,大括号是根据它们在代码中的位置而具有不同含义的。它们用于表示块和对象文字,但仅在允许这种结构的情况下使用。对象文字(“大括号对象”)永远不能作为语句的开头。@Costa:“程序中的一切不是都是由语句和表达式组成的吗?”-完全正确。而作为表达式的
{}
的意思不同于
{}
作为一条语句。还有许多其他用例。JavaScript如何知道是创建一个新对象,还是一个语句块?您缺少了,另请参见。@RobG谢谢,我将很快更新我的答案。它类似于模式匹配语法(例如ERLANG)奇怪的是…@Costa在一句话中说:如果在代码中的某个点上你不确定它是块还是对象,那么它就是块。一个对象必须在一个上下文中,在这个上下文中它被赋值或本身被用作一个值,如果这个上下文不清楚,那么它首先被假定为一个块。例如
()=>({})是一个函数,它在
()={>时返回一个对象
是一个什么都不做的函数。@Costa好的,很公平。最简单的是:如果它可能是一个块,它就是,否则它就是一个对象。同样,保持绝对简单,我们可以检查JS解析规则,以确定何时会出现一个块(或可能出现)。如果我们忽略函数块(
函数
=>
符号)它位于语句可以启动的任何位置。例如,紧跟在控制语句之后(
if
for
while
等)
if (x) x++; else x--;
if (x) {x++;} else {x--;}
{if (x) {x++;} else {x--;}}
function f () {}
function(){return 1;}(); // error: function statement requires name
var x = function(){return 1;}(); // fine
()=>1; // statement; = function that returns "1"
()=>1(); // statement; = function that returns "1()"
(()=>1()); // TypeError: 1 is not a function
(()=>1)(); // what was intended in above (you'd hope)