大括号在JavaScript中做了什么?

时间:2016-07-15 04:27:56

标签: javascript

我在 Eloquent JavaScript 中读到了这一行,并希望有一些清晰度。

  

...大括号在JavaScript中有两个含义。在声明开始时,他们开始发表声明。在任何其他位置,他们描述一个对象。幸运的是,使用大括号对象启动语句几乎没有用,并且......

所以,让我们来回答一下......如果声明'创建一个要执行的语句块,但出现在let中的大括号表示函数调用(作为参数)或变量赋值变为对象文字。

是吗?其他所有案件都是什么?我不确定我是否理解大括号捆绑语句以及何时描述对象的规则。

1 个答案:

答案 0 :(得分:3)

作为对象文字

var a = {field1:value1, field2:value2}

作为函数体

function func() {
    // do something
}
var f = function() { /* do something */ };
var f = ()=>{}; // ditto

其中语句中的第一项是对象文字

// {}.toString(); // syntax error, first brace of statement = code block
({}).toString(); // correct

作为解构分配

var obj = {a:1, b:2, c:3};
var {a:x, c:y} = obj; // assign obj.a to x, and obj.c to y
({a:x, c:y} = obj); // ditto

注意 - 这有一个很多的表格,所以我不会覆盖所有表格,full info found here(感谢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澄清我们想要一个。这就是为什么我们使用({})而不是{},因为前者明确地是parens中的对象文字。

更简单的解释

不要检查何时将{}解析为值,让我们看看它何时不是。通常有两种情况我们{}视为对象文字:作为函数体或作为语句组(我自己的)术语)。

考虑一般控制语句 - ifforwhilewith等。这些都可以完全避免{}。在这方面,{}应被视为语句组因此该术语。

if (x) x++; else x--;
if (x) {x++;} else {x--;}
{if (x) {x++;} else {x--;}}

*注意:switch是个例外,switch(1);错误SyntaxError: missing { before switch body

使用此规则然后我们必须使用()来表示对象文字,如果它是一个语句的开头 - 那么我们就可以了em>启动 ()中的语句,因此您无法在那里启动语句组,只留下一个选项(对象文字或相关语法)。

这会留下函数体。

职能团体

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

function f () {}

它不需要分号(;)。这意味着整个事情是一个单一的陈述。这解释了为什么以下内容在第一种形式而不是第二种形式中给出了语法错误:

function(){return 1;}(); // error: function statement requires name
var x = function(){return 1;}(); // fine

这是因为第一个被解析为一个语句,而一个函数声明语句不能是匿名的。然而,第二个是在值上下文中,并被视为这样。情况与对象文字一样相同,如果它可以是一个声明,它不能是一个值,但如果我们已经在价值范围内深陷,它必须< / em>一个值。

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

()=>...然而有点不同。它被视为()=>{return ...}。但是,如果没有明确的}来完成return语句,语法会贪婪地捕获解析的最大表达式(不一定是 work )。一个很好的例子:

()=>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)