進(jìn)入誤區(qū),請(qǐng)幫忙解答
函數(shù)調(diào)用表達(dá)式
function fn() {}
fn() 這函數(shù)調(diào)用表達(dá)式會(huì)返回一個(gè)值所有是一個(gè)表達(dá)式。當(dāng)函數(shù)fn中return后面沒(méi)有值的時(shí)候,返回的就是undefined,有值則返回的就是return后面的值,是否可以這樣理解?
函數(shù)表達(dá)式
var a = function() {};
function() {} 單獨(dú)應(yīng)該是一個(gè)函數(shù)聲明吧。
當(dāng)賦值變量a時(shí),a = function() {} 就有一個(gè)表達(dá)式。如果這樣的話,a = function() {}應(yīng)該會(huì)返回一個(gè)值吧,如果是這樣的話,請(qǐng)問(wèn)值是多少?
原是表達(dá)式
var b = 1; 在這1是一個(gè)表達(dá)式,b=1也是一個(gè)表達(dá)式。
不解的是 函數(shù)表達(dá)式以上為例。function() {} 就不是表達(dá)式?而a = function() {}這樣就是表達(dá)式了呢?
比較
函數(shù)調(diào)用表達(dá)式。調(diào)用時(shí)會(huì)返回一個(gè)值。所以是表達(dá)式。
函數(shù)表達(dá)式。還以上函數(shù)表達(dá)式為例。function() {}沒(méi)有被調(diào)用,所以不會(huì)返回值,就是一個(gè)函數(shù)聲明,不解的是賦值給a后,這 a = function(){} 后就是表達(dá)式了呢?是的話應(yīng)該肯定返回一個(gè)值吧。那值是什么呢?
其實(shí)沒(méi)有那么復(fù)雜.舉個(gè)例子
function fn(){} 這就是聲明一個(gè)函數(shù). 調(diào)用函數(shù)就是 fn();
如果函數(shù)體內(nèi)返回了值,那么可以創(chuàng)建變量接收,也可以不接收; 例如 var a = fn(); fn有return,那么a就等于返回值,沒(méi)有就是undefined.
var a = function (){} 這是函數(shù)創(chuàng)建的另外一種方法. 那這個(gè)函數(shù)不會(huì)執(zhí)行, 還得自己調(diào)用.
a(); 調(diào)用函數(shù). 函數(shù)返回不返回值,和這兩種方式創(chuàng)建函數(shù)無(wú)關(guān).
var b = a(); b就是函數(shù)執(zhí)行返回的值.
本來(lái)這么基礎(chǔ)的問(wèn)題是不想回答的,但是看了前面幾個(gè)回答,感覺(jué)不少人對(duì)表達(dá)式這個(gè)基礎(chǔ)知識(shí)點(diǎn)可能還不是完全理解,所以就簡(jiǎn)單寫(xiě)一下吧。
什么是表達(dá)式?表達(dá)式是用運(yùn)算符連接的一個(gè)或多個(gè)值、變量、函數(shù)及其他運(yùn)算數(shù)所形成的式子。
fn()這是一個(gè)函數(shù)調(diào)用表達(dá)式,因?yàn)?code>()是函數(shù)調(diào)用運(yùn)算符(去查一下運(yùn)算符有哪些就知道了)a = function() {}這是一個(gè)復(fù)合表達(dá)式,它由a、function() {}兩個(gè)子表達(dá)式和一個(gè)賦值運(yùn)算符組成。但是注意var a = function() {};不是一個(gè)表達(dá)式,而是一個(gè)語(yǔ)句,因?yàn)樗?code>var和分號(hào),它們都不是運(yùn)算符b = 1和var b = 1;與上一條相同不解的是 函數(shù)表達(dá)式以上為例。function() {} 就不是表達(dá)式?而a = function() {}這樣就是表達(dá)式了呢?
首先,為什么單獨(dú)寫(xiě)function a() {}不是表達(dá)式?
這是因?yàn)檫@句代碼“聲明”了一個(gè)名為a的函數(shù)。在解析的時(shí)候,JS引擎會(huì)對(duì)這種形式的函數(shù)聲明做一些特殊處理,比如聲明提升。
用一句不太嚴(yán)格的話來(lái)解釋,函數(shù)聲明類似于整條語(yǔ)句var a = function() {};,只是JS引擎在遇到這么一個(gè)聲明的時(shí)候會(huì)自動(dòng)對(duì)其進(jìn)行提升。前面已經(jīng)解釋過(guò)這種形式的語(yǔ)句不是表達(dá)式。
那為什么a = function() {}是一個(gè)表達(dá)式呢?
在JS中,函數(shù)是一等公民,可以像其他值和變量那樣賦值、傳遞,這個(gè)表達(dá)式右邊正是這么一個(gè)函數(shù)類型的值。甚至你還可以這么寫(xiě):a = function a() {},右邊看起來(lái)與前面的函數(shù)聲明更像了,但這仍然是一個(gè)表達(dá)式,因?yàn)樵贘S中,匿名函數(shù)也可以指定一個(gè)名字。
因此關(guān)于這一點(diǎn),總結(jié)下來(lái)就是:JS引擎在解析時(shí)會(huì)依據(jù)函數(shù)的定義形式不同而做出不同的解析,其中僅會(huì)在函數(shù)定義不作為任何子表達(dá)式存在時(shí)才是函數(shù)聲明,否則就會(huì)把該函數(shù)的定義當(dāng)做函數(shù)表達(dá)式來(lái)解析。
謝邀。
簡(jiǎn)單地說(shuō),這是語(yǔ)言規(guī)范規(guī)定的:function a() {}單獨(dú)存在時(shí)就是函數(shù)聲明,否則是函數(shù)表達(dá)式。
證據(jù)(或說(shuō)明)請(qǐng)參考語(yǔ)言規(guī)范。如下:
一. 首先,看一下函數(shù)聲明()和函數(shù)表達(dá)式()的定義:
FunctionDeclaration :
function Identifier ( FormalParameterList[opt] ) { FunctionBody }
FunctionExpression :
function Identifier[opt] ( FormalParameterList[opt] ) { FunctionBody }
可見(jiàn),但從語(yǔ)法形式上,兩者幾乎是完全一樣的。唯一區(qū)別是,作為函數(shù)表達(dá)式時(shí),標(biāo)識(shí)符是可選的。
二. 函數(shù)聲明只能單獨(dú)使用,是一個(gè)與聲明(statement)同級(jí)別的語(yǔ)法單元:
Program :
SourceElements[opt]
SourceElements :
SourceElement
SourceElements SourceElement
SourceElement :
Statement
FunctionDeclaration
三. 而函數(shù)表達(dá)式作為一個(gè)``,是只能作為其他表達(dá)式的一部分使用,不能單獨(dú)存在的:
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
OK,這就很清楚了。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。