3

I've been testing this in the browser console of FireFox, not sure if other javascript environments have this:

◄ {x:function(){console.log("test");}}["x"]();
► SyntaxError: function statement requires a name

Why? This works though:

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

(In case anyone is wondering: I really hate the switch,case,break syntax. I'd rather use this construction.)

4

4 回答 4

5

第一个括号中的括号导致块语句

第一个在注入分号时看起来像这样

{
    x : function() { 
        console.log("test");
    }
};
["x"]();
于 2013-11-07T19:44:46.810 回答
3

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

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

于 2013-11-07T19:46:16.713 回答
2

这是因为您正在创建一个块。正如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
于 2013-11-07T19:47:53.047 回答
0

在 Opera 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

它会起作用的。

于 2013-11-07T19:51:25.820 回答