理解JavaScript术语和符号
以ECMA-262为例理解JavaScript术语和符号,javascript,Javascript,以ECMA-262为例 Syntax MemberExpression : PrimaryExpression FunctionExpression MemberExpression [ Expression ] MemberExpression . IdentifierName new MemberExpression Arguments NewExpression : MemberExpression new NewExpression
Syntax
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
NewExpression :
MemberExpression
new NewExpression
CallExpression :
MemberExpression Arguments
CallExpression Arguments
CallExpression [ Expression ]
CallExpression . IdentifierName
Arguments :
( )
( ArgumentList )
ArgumentList :
AssignmentExpression
ArgumentList , AssignmentExpression
LeftHandSideExpression :
NewExpression
CallExpression
具体内容如下
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
第一个问题是:
(表达式)
在主要表达式中的含义是什么
{prop:'prop'}
是ObjectLiteral
。因此,{prop:'prop'}()
是调用表达式
。我想和你核实一下,但我有
[20:16:12.347] SyntaxError: syntax error @ http://fiddle.jshell.net/_display/:21
第二个问题:
为什么会出现这种错误?我认为{prop:'prop'}()
是正确的一行,我认为错误可能是{prop:'prop'}不是一个函数
UPD:我正在使用firefox 25.0.1第一个问题:
{prop: 'prop'}()
(表达式)
仅指(
,一个表达式
,然后是)
第二个问题:
{prop: 'prop'}()
正在分析为:
// a block
{
// syntax error
prop: 'prop'
}
// syntax error
()
您可以添加参数,然后会得到预期的错误:
({prop: 'prop'}())
这同样有效,因为块在那里无效:
var obj = {prop: 'prop'}
obj()
至于大问题:
在最初的表达辩护中(表达)是什么意思
这是一个递归定义,用于在语法中嵌套任意内容
JavaScript语法允许以下操作
var o = "Hello" +({stuff:"stuff"});
虽然这在语义上不是很有意义,但我们需要能够将任意表达式表示为语言中表达式的一部分
语法中的递归属性允许任意嵌套
让我们通过示例来了解这一点。
更简单的语法可能是描述基础数学的语法。我们想描述一些基本的东西,比如3+5+3/(5+3)
我们希望允许运算符优先级和任意嵌套-这里的定义本身是递归的。让我们看看维基百科:
<expression> ::= <term> | <expression> "+" <term>
<term> ::= <factor> | <term> "*" <factor>
<factor> ::= <constant> | <variable> | "(" <expression> ")"
<variable> ::= "x" | "y" | "z"
<constant> ::= <digit> | <digit> <constant>
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
当它点击此处的块
时,它会依次看到:
Block :
{ StatementListopt }
StatementList :
Statement
StatementList Statement
Semantics
就语法而言,我们在语句列表
中,在块
中
该语句包括prop:prop
。在这里,prop:
被解析为LabelledStatement
,这解释了错误
请参阅如何在板中实现并包装它。我相信,{…}()
在语法上是有效的。在我的chrome浏览器上,我没有看到语法错误,而是看到“Object不是函数”——这意味着它是有效的。在您的小提琴中,只需将var x=
预加到您的行中,就会得到相同的错误。@。您需要添加那个作业吗?@非常有趣,谢谢您的评论。你能解释一下为什么varx={prop:'prop'}()
在图形上是有效的吗。如果可能,请提供一个证明/链接。我仍然无法回答我的两个问题。@cstack Its,因为JS解析器将其视为代码块而不是对象。:)谢谢你的回答!但我还有一个问题:你能解释一下({prop:'prop'})(
和({prop:'prop'}())
?@St.Antario它们在语法上不同,在语义上相同(语法错误)。这里语法的关键区别在于,在第一种方法中,我们首先将对象作为表达式求值,然后尝试调用它,而在第二种方法中,我们尝试在表达式内部调用它。