[JavaScript] function(){}()為什么不合法

ES3 P63

ExpressionStatement :
[lookahead ? {{, function}] Expression ;

Note that an ExpressionStatement cannot start with an opening curly brace because that might make itambiguous with a Block. Also, an ExpressionStatement cannot start with the function keyword becausethat might make it ambiguous with a FunctionDeclaration.


上下文無關(guān)文法《ECMA-262, 3rd edition, December 1999》

Program :
    SourceElements

SouceElements :
    SouceElement
    SouceElements SourceElement

SouceElement :
    Statement
    FunctionDeclaration

Statement :
    Block
    VariableStatement
    EmptyStatement
    ExpressionStatement
    IfStatement
    IterationStatement
    ContinueStatement
    BreakStatement
    ReturnStatement
    WithStatement
    LabelledStatement
    SwitchStatement
    ThrowStatement
    TryStatement

ExpressionStatement :
    [lookahead ? {{, function}] Expression ;

FunctionDeclaration :
    function Identifier ( FormalParameterList[opt] ) { FunctionBody }

這幾個產(chǎn)生式表明了以Program為根的語法樹結(jié)構(gòu)汇陆。


(1)首先,“function(){}()”無法歸約為CallExpression蒿偎。

CallExpression 
<- LeftHandSideExpression 
<- PostfixExpression 
<- UnaryExpression 
<- MultiplicativeExpression 
<- AdditiveExpression 
<- ShiftExpression 
<- RelationalExpression 
<- EqualityExpression 
<- BitwiseANDExpression 
<- BitwiseXORExpression 
<- BitwiseORExpression 
<- LogicalANDExpression 
<- LogicalORExpression 
<- ConditionalExpression 
<- AssignmentExpression 
<- Expression
[失敗了] <- ExpressionStatement 
<- Statement 
<- SourceElement 
<- SourceElements 
<- Program

失敗的原因是障癌,
<u></u>Expression要想歸約為ExpressionStatement筐付,就不能以左大括號“{”或“function”開頭幽钢。

(2)那么,我們只能認為“function(){}()”是由兩部分構(gòu)成的了逊彭。

program
-> SourceElements
-> SourceElements SourceElement
-> SourceElement SourceElement

把“funtion(){}”和“()”都分別向SourceElement歸約咸灿。
然而,這又不行侮叮。

(3)“funtion(){}”無法歸約為SourceElement析显。
因為,無論是先歸約為Statement,還先歸約為FunctionDeclaration都不行谷异。
歸約為Statement要求不能以function開頭分尸,(與上面的失敗原因相同)
歸約為FunctionDeclaration要求必須指定函數(shù)名。

(4)然而歹嘹,我們又沒有其他歸約方法了箩绍,只能失敗了。


而加上符號以后尺上,
例如“!function(){}()”材蛛,并不是以“function開頭”的,
所以通過了ExpressionExpressionStatement的歸約怎抛。

!function(){}()
<- ! function Identifieropt ( FormalParameterListopt ) { FunctionBody } Arguments
<- ! FunctionExpression Arguments
<- ! MemberExpression Arguments
<- ! CallExpression
<- ! LeftHandSideExpression
<- ! PostfixExpression
<- ! UnaryExpression
<- UnaryExpression
<- MultiplicativeExpression
<- AdditiveExpression
<- ShiftExpression
<- RelationalExpression
<- EqualityExpression
<- BitwiseANDExpression
<- BitwiseXORExpression
<- BitwiseORExpression
<- LogicalANDExpression
<- LogicalORExpression
<- ConditionalExpression
<- AssignmentExpression
<- Expression
<- ExpressionStatement
<- Statement
<- SourceElement
<- SourceElements
<- Program

同理可以推導(dǎo)(function(){}())卑吭,(function(){})()


值得指出的是,
function(){}()”就算指定了函數(shù)名马绝,也不行豆赏。
因為后面的“()”也不能歸約為SourceElement

而“function f(){}(1)”就是合法的富稻,
function f(){}”歸約為FunctionDeclaration掷邦,
而“(1)”可以歸約為Expression,視為括號運算符椭赋,或稱為分組運算符抚岗。

(Expression) 
<- PrimaryExpression
<- MemberExpression
<- NewExpression
<- LeftHandSideExpression
<- PostfixExpression
<- UnaryExpression
<- MultiplicativeExpression
<- AdditiveExpression
<- ShiftExpression
<- RelationalExpression
<- EqualityExpression
<- BitwiseANDExpression
<- BitwiseXORExpression
<- BitwiseORExpression
<- LogicalANDExpression
<- LogicalORExpression
<- ConditionalExpression
<- AssignmentExpression
<- Expression

示例1:(function(){})()

( function Identifieropt ( FormalParameterListopt ) { FunctionBody } ) Arguments
( FunctionExpression ) Arguments
(MemberExpression ) Arguments
(NewExpression ) Arguments
( LeftHandSideExpression ) Arguments
( PostfixExpression ) Arguments
( UnaryExpression ) Arguments
( MultiplicativeExpression ) Arguments
( AdditiveExpression ) Arguments
( ShiftExpression ) Arguments
( RelationalExpression ) Arguments
( EqualityExpression ) Arguments
( BitwiseANDExpression ) Arguments
( BitwiseXORExpression ) Arguments
( BitwiseORExpression ) Arguments
( LogicalANDExpression ) Arguments
( LogicalORExpression ) Arguments
( ConditionalExpression ) Arguments
( AssignmentExpression ) Arguments
( Expression ) Arguments
PrimaryExpression Arguments
MemberExpression Arguments
CallExpression
LeftHandSideExpression
PostfixExpression
UnaryExpression
MultiplicativeExpression
AdditiveExpression
ShiftExpression
RelationalExpression
EqualityExpression
BitwiseANDExpression
BitwiseXORExpression
BitwiseORExpression
LogicalANDExpression
LogicalORExpression
ConditionalExpression
AssignmentExpression
Expression
ExpressionStatement
Statement
SourceElement
SourceElements
Program

示例2:(function(){}())

( function Identifieropt ( FormalParameterListopt ) { FunctionBody }Arguments )
( FunctionExpressionArguments )
( MemberExpression Arguments )
( CallExpression )
( LeftHandSideExpression )
( PostfixExpression )
( UnaryExpression )
( MultiplicativeExpression )
( AdditiveExpression )
( ShiftExpression )
( RelationalExpression )
( EqualityExpression )
( BitwiseANDExpression )
( BitwiseXORExpression )
( BitwiseORExpression )
( LogicalANDExpression )
( LogicalORExpression )
( ConditionalExpression )
( AssignmentExpression )
( Expression )
PrimaryExpression
MemberExpression
NewExpression
LeftHandSideExpression
PostfixExpression
UnaryExpression
MultiplicativeExpression
AdditiveExpression
ShiftExpression
RelationalExpression
EqualityExpression
BitwiseANDExpression
BitwiseXORExpression
BitwiseORExpression
LogicalANDExpression
LogicalORExpression
ConditionalExpression
AssignmentExpression
Expression
ExpressionStatement
Statement
SourceElement
SourceElements
Program

示例3:!function(){}()

! function Identifieropt( FormalParameterListopt) { FunctionBody }Arguments
! FunctionExpressionArguments
! MemberExpression Arguments
! CallExpression
! LeftHandSideExpression
! PostfixExpression
! UnaryExpression
UnaryExpression
MultiplicativeExpression
AdditiveExpression
ShiftExpression
RelationalExpression
EqualityExpression
BitwiseANDExpression
BitwiseXORExpression
BitwiseORExpression
LogicalANDExpression
LogicalORExpression
ConditionalExpression
AssignmentExpression
Expression
ExpressionStatement
Statement
SourceElement
SourceElements
Program

示例4:function(){}()

functionIdentifier( FormalParameterListopt) { FunctionBody } SourceElement
FunctionDeclarationSourceElement
SourceElement SourceElement
SourceElements  SourceElement
SourceElements
Program
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哪怔,隨后出現(xiàn)的幾起案子宣蔚,更是在濱河造成了極大的恐慌,老刑警劉巖认境,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件件已,死亡現(xiàn)場離奇詭異,居然都是意外死亡元暴,警方通過查閱死者的電腦和手機篷扩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茉盏,“玉大人鉴未,你說我怎么就攤上這事○蹋” “怎么了铜秆?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讶迁。 經(jīng)常有香客問我连茧,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任啸驯,我火速辦了婚禮客扎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罚斗。我一直安慰自己徙鱼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布针姿。 她就那樣靜靜地躺著袱吆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪距淫。 梳的紋絲不亂的頭發(fā)上绞绒,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音榕暇,去河邊找鬼蓬衡。 笑死,一個胖子當(dāng)著我的面吹牛拐揭,可吹牛的內(nèi)容都是我干的撤蟆。 我是一名探鬼主播奕塑,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼堂污,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了龄砰?” 一聲冷哼從身側(cè)響起盟猖,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎换棚,沒想到半個月后式镐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡固蚤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年娘汞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夕玩。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡你弦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燎孟,到底是詐尸還是另有隱情禽作,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布揩页,位于F島的核電站旷偿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萍程,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一幢妄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尘喝,春花似錦磁浇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缔赠,卻和暖如春衍锚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗤堰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工戴质, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人踢匣。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓告匠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親离唬。 傳聞我的和親對象是個殘疾皇子后专,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容