Javascript 为什么这里需要函数名?
我已经在FireFox的浏览器控制台中测试过了,不确定其他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
◄ {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视为玩具编程语言。。。