2 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
有趣的問(wèn)題。措辭可能有軟邊界,這也是造成這種混亂的部分原因。
首先,一些粗略的定義:
表達(dá):我認(rèn)為最好通過(guò)一個(gè)例子來(lái)思考這一點(diǎn)。
2 * 2
是一個(gè)表達(dá)式,因?yàn)槟梢岳^續(xù)對(duì)其進(jìn)行其他操作,例如2 * 2 - 3
.?if (...)
另一方面,它不是 javascript 中的表達(dá)式,它不會(huì)解析為您可以對(duì)其進(jìn)行進(jìn)一步操作的值。這樣做是無(wú)效的if (...) {...} / 2
。這個(gè)“定義”有一些漏洞,但對(duì)于這個(gè)答案來(lái)說(shuō)應(yīng)該足夠好了。聲明:聲明只是聲明您將使用某個(gè)變量名稱。因此,在您的示例中
const foo = 5
,它是const foo
實(shí)際聲明的部分,= 5
只是初始化聲明。
考慮到這一點(diǎn),讓我們考慮兩個(gè)函數(shù)示例,并看看該術(shù)語(yǔ)如何在這些示例中發(fā)揮作用:
const g = function() {}
這里正在進(jìn)行一項(xiàng)聲明,即const g
.?我們還看到有一個(gè)函數(shù)被創(chuàng)建并分配給 g。我們正在用結(jié)果做某事function() {}
(我們將其分配給某物),這意味著 javascript 會(huì)將其解釋為函數(shù)表達(dá)式。
function f() {}
我們沒(méi)有將此函數(shù)用作表達(dá)式(在創(chuàng)建它后我們沒(méi)有對(duì)其進(jìn)行任何其他操作),因此 javascript 實(shí)際上會(huì)以與我們的第一個(gè)示例不同的方式對(duì)待它。它將在本地命名空間中聲明 f ,并將應(yīng)用函數(shù)提升。如果您只是添加了+
before?function f() {}
,那么您會(huì)導(dǎo)致 javascript 將其解釋為表達(dá)式,并且這些功能將被禁用。您可以在開發(fā)工具中嘗試 - 輸入+function f(){}
or?const g = function f(){}
, f 將保持未定義狀態(tài)。
javascript 在不同的上下文中以不同的方式對(duì)待 function 關(guān)鍵字這一事實(shí)是這種語(yǔ)言選擇的核心。您幾乎可以將“function”關(guān)鍵字視為具有兩種不同的含義,所選擇的含義取決于上下文。任何時(shí)候函數(shù)在表達(dá)式上下文中使用或未命名時(shí),它都會(huì)采用“表達(dá)式”形式,我們將其稱為“函數(shù)表達(dá)式”。否則,它采用包含一些額外功能的替代形式,例如將函數(shù)名稱聲明為局部變量。這可能就是我們將這種替代形式稱為函數(shù)聲明的原因。然而,就像OP正確指出的那樣,即使使用const f = function() {}
,聲明仍然發(fā)生,只是沒(méi)有通過(guò)function
關(guān)鍵字發(fā)生。
腳注:對(duì)于像這樣的示例+function f(
) {}
,f 不會(huì)在與 g 相同的范圍內(nèi)定義,但它確實(shí)在 f 體內(nèi)定義。換句話說(shuō),任何命名函數(shù)表達(dá)式都在其自己的主體內(nèi)聲明其名稱。

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
那為什么叫函數(shù)表達(dá)式呢?:
給變量賦值,實(shí)際上就是一個(gè)表達(dá)式。在你的例子中foo = 5,這是一個(gè)表達(dá)式。你也在聲明foo,但它仍然是一個(gè)表達(dá)式。
類似地,另一個(gè)示例const bar = function() {}稱為函數(shù)表達(dá)式,以區(qū)分函數(shù)聲明和函數(shù)表達(dá)式。
函數(shù)表達(dá)式
const bar = function() {
// Some code
};
與函數(shù)聲明
function foo() {
// Some code
};
添加回答
舉報(bào)