我在 Eloquent JavaScript 中读到了这一行,并希望有一些清晰度。
...大括号在JavaScript中有两个含义。在声明开始时,他们开始发表声明。在任何其他位置,他们描述一个对象。幸运的是,使用大括号对象启动语句几乎没有用,并且......
所以,让我们来回答一下......如果声明'创建一个要执行的语句块,但出现在let中的大括号表示函数调用(作为参数)或变量赋值变为对象文字。
是吗?其他所有案件都是什么?我不确定我是否理解大括号捆绑语句以及何时描述对象的规则。
答案 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中的对象文字。
不要检查何时将{}
解析为值,让我们看看它何时不是。通常有两种情况我们不将{}
视为对象文字:作为函数体或作为语句组(我自己的)术语)。
考虑一般控制语句 - if
,for
,while
,with
等。这些都可以完全避免{}
。在这方面,{}
应被视为语句组因此该术语。
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)