这是因为您正在创建一个块。正如MDN 描述的那样:
块语句用于对零个或多个语句进行分组。该块由一对大括号分隔。
这是一个块:
{}
这是一个声明。它不返回任何东西。它所做的只是将零个或多个其他语句组合在一起。当 Javascript 看到{
一行的开头时,它会认为“啊哈,我们这里有一个块”。
然而,这不是一个块:
({})
那是一种表达。它有一个返回值。在这里,在表达式上下文中,{}
分隔对象字面量,而不是块。
所以,用你的代码,让我们把它分解一下:
{ // start a block
x: // create a label called x
function(){console.log("test");} // create a function expression
} // end the block
["x"](); // create an array with one element and attempt to execute it as a function
现在,最后一行显然会失败,但我们永远不会到达那里。当 Javascript 在行首看到function
时,它需要一个函数语句。您正在给它一个匿名函数表达式。这在此上下文中无效并导致错误。
相比之下,您的其他声明:
( // start an expression
{ // create an object
x: function(){console.log("test");} // create a property called x with an anonymous function as its value
} // end the object
) // end the expression and return the object
["x"] // get the `x` property from the returned object
(); // execute it