为什么在行尾需要分号?

Joh*_*ron 9 javascript syntax

为什么这样做:

a = []
a.push(['test']);
(function() {alert('poop')})()
Run Code Online (Sandbox Code Playgroud)

但这给出了错误"数字不是函数":

a = []
a.push(['test'])
(function() {alert('poop')})()
Run Code Online (Sandbox Code Playgroud)

唯一的区别是第2行末尾的分号.我已经写了很长时间的Javascript.我知道自动分号插入,但我无法弄清楚会导致此错误的原因.

Cha*_*ion 12

看看这个链式函数调用的例子.

a.push(['test'])(function() {alert('poop')})()
Run Code Online (Sandbox Code Playgroud)

看起来熟悉?这就是编译器/解释器查看代码的方式.

详情

这是用于描述调用表达式的语法的一部分.

CallExpression : 
	MemberExpression Arguments 
	CallExpression Arguments 
	CallExpression [ Expression ] 
	CallExpression . IdentifierName 

基本上每个组(...)都被视为原始MemberExpression的参数. a.push

a.push (['test'])                // MemberExpression Arguments 
(function() {alert('poop')})     // Arguments  
()                               // Arguments 
Run Code Online (Sandbox Code Playgroud)

或者更正式

CallExpression(
    CallExpression(  
        CallExpression(
            MemberExpression( a.push ),
            Arguments( (['test']) )
        ),
        Arguments( (function() {alert('poop')}) )
    ),
    Arguments( () )
)