Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解JavaScript术语和符号_Javascript - Fatal编程技术网

理解JavaScript术语和符号

理解JavaScript术语和符号,javascript,Javascript,以ECMA-262为例 Syntax MemberExpression : PrimaryExpression FunctionExpression MemberExpression [ Expression ] MemberExpression . IdentifierName new MemberExpression Arguments NewExpression : MemberExpression new NewExpression

以ECMA-262为例

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它们在语法上不同,在语义上相同(语法错误)。这里语法的关键区别在于,在第一种方法中,我们首先将对象作为表达式求值,然后尝试调用它,而在第二种方法中,我们尝试在表达式内部调用它。