亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么叫函數表達式而不是函數聲明呢?

為什么叫函數表達式而不是函數聲明呢?

阿波羅的戰車 2023-08-10 15:59:34
我開始學習 React,現在我又回到了 JavaScript 中的一些更基本的概念。我已經了解了函數表達式和函數聲明之間的區別,但仍然困惑我為什么函數表達式不稱為函數聲明。如果這是一個變量聲明:const foo = 5;那為什么這叫函數表達式呢?:const bar = function() {    // Some code};在第二個例子中,不是聲明了“const bar”嗎?為什么函數表達式和函數聲明如此命名?為什么函數表達式不稱為函數聲明,反之亦然?
查看完整描述

2 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

有趣的問題。措辭可能有軟邊界,這也是造成這種混亂的部分原因。

首先,一些粗略的定義:

  • 表達:我認為最好通過一個例子來思考這一點。2 * 2是一個表達式,因為您可以繼續對其進行其他操作,例如2 * 2 - 3.?if (...)另一方面,它不是 javascript 中的表達式,它不會解析為您可以對其進行進一步操作的值。這樣做是無效的if (...) {...} / 2。這個“定義”有一些漏洞,但對于這個答案來說應該足夠好了。

  • 聲明:聲明只是聲明您將使用某個變量名稱。因此,在您的示例中const foo = 5,它是const foo實際聲明的部分,= 5只是初始化聲明。

考慮到這一點,讓我們考慮兩個函數示例,并看看該術語如何在這些示例中發揮作用:

  1. const g = function() {}

這里正在進行一項聲明,即const g.?我們還看到有一個函數被創建并分配給 g。我們正在用結果做某事function() {}(我們將其分配給某物),這意味著 javascript 會將其解釋為函數表達式。

  1. 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 體內定義。換句話說,任何命名函數表達式都在其自己的主體內聲明其名稱。


查看完整回答
反對 回復 2023-08-10
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

那為什么叫函數表達式呢?:


給變量賦值,實際上就是一個表達式。在你的例子中foo = 5,這是一個表達式。你也在聲明foo,但它仍然是一個表達式。


類似地,另一個示例const bar = function() {}稱為函數表達式,以區分函數聲明和函數表達式。


函數表達式


const bar = function() {

    // Some code

};

與函數聲明


function foo() {

    // Some code

};


查看完整回答
反對 回復 2023-08-10
  • 2 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號