簡體   English   中英

為什么函數聲明不是變量聲明時的聲明

[英]Why is a function declaration not a statement while a variable declaration is

這似乎是一個愚蠢的問題,但我真的無法繞過它。 當我想到為什么在變量聲明之后有分號而不是函數聲明時,我開始懷疑這一點。 這是否意味着函數聲明是一個表達式?

聲明的官方含義是什么? 我一直在找答案,說一個語句是一個“命令”,告訴計算機該做什么,但不是一個函數聲明告訴計算機該怎么做? 它是否與執行代碼時加載時有關?

變量聲明可能有副作用(例如, var x = alert(42); )。

函數聲明不能​​。

當我想到為什么在變量聲明之后有分號而不是函數聲明時,我開始懷疑這一點

並非每個語句都以分號結尾

帶分號的語句示例:

  • 變量聲明: var foo = <expression>;
  • 表達式語句: <expression>;
  • while while循環: do <statement> while (<expression>);

不帶分號的示例:

  • if語句: if (<expression>) <statement>
  • 嘗試catch語句: try <block> catch (<identifier>) <block>
  • For循環: for (...) <statement>
  • 阻止聲明: { <statement list> }

這是否意味着函數聲明是一個表達式?

不,這比那更復雜。 函數聲明不是語句。 它們也不是表達式,它們是源元素 語句和函數聲明都是源元素。 **


聲明的官方含義是什么?

我不能告訴你官方定義,但在JS的上下文中我會說“它是一個不產生可賦值結果/值的指令”。 另一方面,表達式產生可以在其他表達式中使用的結果。


**很高興知道,但有點偏離主題:由於函數聲明不是語句,因此技術上不允許在塊內使用它們。 如果我們也考慮吊裝,那就更加明顯了。 這個例子應該在每個瀏覽器中拋出語法錯誤,但不幸的是它沒有。

if (true) {
  function foo() { alert('foo'); }
} else {
  function foo() { alert('bar'); }
}
foo();

這導致不同瀏覽器中的不同行為。 雖然Chrome會顯示bar ,但Firefox會顯示foo Chrome只提升兩個功能聲明,第二個覆蓋第一個。 Firefox將兩種聲明都解釋為函數表達式

在不同的瀏覽器中自己嘗試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM