5 回答

TA貢獻1804條經(jīng)驗 獲得超8個贊
本來這么基礎(chǔ)的問題是不想回答的,但是看了前面幾個回答,感覺不少人對表達式這個基礎(chǔ)知識點可能還不是完全理解,所以就簡單寫一下吧。
什么是表達式?表達式是用運算符連接的一個或多個值、變量、函數(shù)及其他運算數(shù)所形成的式子。
fn()
這是一個函數(shù)調(diào)用表達式,因為()
是函數(shù)調(diào)用運算符(去查一下運算符有哪些就知道了)a = function() {}
這是一個復(fù)合表達式,它由a
、function() {}
兩個子表達式和一個賦值運算符組成。但是注意var a = function() {};
不是一個表達式,而是一個語句,因為它包含var
和分號,它們都不是運算符b = 1
和var b = 1;
與上一條相同
不解的是 函數(shù)表達式以上為例。function() {} 就不是表達式?而a = function() {}這樣就是表達式了呢?
首先,為什么單獨寫function a() {}
不是表達式?
這是因為這句代碼“聲明”了一個名為a
的函數(shù)。在解析的時候,JS引擎會對這種形式的函數(shù)聲明做一些特殊處理,比如聲明提升。
用一句不太嚴格的話來解釋,函數(shù)聲明類似于整條語句var a = function() {};
,只是JS引擎在遇到這么一個聲明的時候會自動對其進行提升。前面已經(jīng)解釋過這種形式的語句不是表達式。
那為什么a = function() {}
是一個表達式呢?
在JS中,函數(shù)是一等公民,可以像其他值和變量那樣賦值、傳遞,這個表達式右邊正是這么一個函數(shù)類型的值。甚至你還可以這么寫:a = function a() {}
,右邊看起來與前面的函數(shù)聲明更像了,但這仍然是一個表達式,因為在JS中,匿名函數(shù)也可以指定一個名字。
因此關(guān)于這一點,總結(jié)下來就是:JS引擎在解析時會依據(jù)函數(shù)的定義形式不同而做出不同的解析,其中僅會在函數(shù)定義不作為任何子表達式存在時才是函數(shù)聲明,否則就會把該函數(shù)的定義當(dāng)做函數(shù)表達式來解析。

TA貢獻2037條經(jīng)驗 獲得超6個贊
你這兒就是典型的理解過度。給你一段代碼,自己領(lǐng)悟吧
var a; //聲明一個變量 這里是一個聲明
a = 13; //變量賦值
上面的代碼等同于
var a = 13; //聲明變量并賦值 這里是一個表達式
同理:
function a(){ //這里一個聲明
}
var a = function(){ //這里是一個表達式
}

TA貢獻1833條經(jīng)驗 獲得超4個贊
簡單地說,這是語言規(guī)范規(guī)定的:function a() {}
單獨存在時就是函數(shù)聲明,否則是函數(shù)表達式。
證據(jù)(或說明)請參考語言規(guī)范。如下:
一. 首先,看一下函數(shù)聲明()和函數(shù)表達式()的定義:
FunctionDeclaration :
function Identifier ( FormalParameterList[opt] ) { FunctionBody }
FunctionExpression :
function Identifier[opt] ( FormalParameterList[opt] ) { FunctionBody }
可見,但從語法形式上,兩者幾乎是完全一樣的。唯一區(qū)別是,作為函數(shù)表達式時,標識符是可選的。
二. 函數(shù)聲明只能單獨使用,是一個與聲明(statement)同級別的語法單元:
Program :
SourceElements[opt]
SourceElements :
SourceElement
SourceElements SourceElement
SourceElement :
Statement
FunctionDeclaration
三. 而函數(shù)表達式作為一個``,是只能作為其他表達式的一部分使用,不能單獨存在的:
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
OK,這就很清楚了。

TA貢獻1836條經(jīng)驗 獲得超13個贊
添加回答
舉報