Javascript 为什么这里需要函数名?

Javascript 为什么这里需要函数名?,javascript,firefox,Javascript,Firefox,我已经在FireFox的浏览器控制台中测试过了,不确定其他javascript环境是否有: ◄ {x:function(){console.log("test");}}["x"](); ► SyntaxError: function statement requires a name 为什么??不过,这是可行的: ◄ ({x:function(){console.log("test");}})["x"](); ► undefined ► "test" (如果有人想知道:我真的很讨厌switc

我已经在FireFox的浏览器控制台中测试过了,不确定其他javascript环境是否有:

◄ {x:function(){console.log("test");}}["x"]();
► SyntaxError: function statement requires a name
为什么??不过,这是可行的:

◄ ({x:function(){console.log("test");}})["x"]();
► undefined
► "test"

(如果有人想知道:我真的很讨厌switch,case,break语法。我宁愿使用这种结构。)

第一个括号中的括号导致了一个错误

第一个在注入分号时是这样的

{
    x : function() { 
        console.log("test");
    }
};
["x"]();

JavaScript的语法可能不明确。第一个示例被解析为打开块(
{
),然后是标签(
x:
,通过
break
continue
)跳转到标签,然后是函数声明。声明函数时,必须提供名称


第二个示例被解析为表达式,因为它被括在括号中(
),所以
{
被解释为具有
x
属性的匿名对象,该属性的值是函数表达式。函数语句可以是匿名的。

这是因为您正在创建一个块。例如:

block语句用于将零个或多个语句分组。该语句块由一对花括号分隔

这是一个街区:

{}
它是一个语句。它不返回任何内容。它所做的只是将零个或多个其他语句组合在一起。当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
时,它需要一个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

在歌剧12.16中,除了告诉你之外,它基本上做了相同的事情

["x"] is not a function
但事实并非如此: 在第一个语句中,定义

{x:function(){console.log("test");}}
如果您自己输入,它将计算为

function(){console.log("test");}
但是如果你没有在它周围加括号,它就会这样做,计算到一个匿名对象,然后开始你剩下的语句。 如果你放一个像这样的点:

{x:function(){console.log("test");}}.x
将出现语法错误。如果您这样做

({x:function(){console.log("test");}}).x

它会起作用。

FYI:Chrome给出了一个“意外的标记”({x:1}1(一)
{x:1,y:2}
语法错误:意外的标记:(哈?)啊,但是
({x:1,y:2})
对象{x:1,y:2}我想这是一个语句表达式的东西。js中没有goto。标签与
break
continue
一起使用。JavaScript怎么可能没有
goto
?现在我知道为什么一些真正的程序员将JavaScript视为玩具编程语言。。。