2 回答

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

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