# 何謂表達式(Expression)與陳述式(Statement)?
###### tags: `JavaScript` `JS 直播班 - 2021 秋季班`
## 陳述式(statement)
一定會做事,但<font color="red">**不會產生數值**</font>
不能放在JS會產生出數值的地方
EX: 函數的return或是parameter的地方
### 以下為常見的陳述式
#### 流程控制
* block
* break
* continue
* if...else
* switch
* try...catch
* throw
#### 宣告
**宣告會讓整個函式內容在語法解析階段都會保留進記憶體空間,所以屬於函式的陳述式,
JS會幫你保留記憶體空間**
* let
* const
* var
## 表達式(運算式)
<font color="red">**任何一段可以取得一個值的程式碼**</font>
表達式的<font color="red">**執行結果會回傳一個值**</font>,而該值不一定要賦予給任一變數。譬如運算、賦值、呼叫函式等
概念上,有兩種不同型態的運算式:
1. 將一個值指定給一個變數
```=Javascript
let x; //這是陳述式
x=7; //這是表達式,賦予7給x
```
2. 只為了取得值而解析的運算式。
```=javascript
3+4 //這個運算式利用+把3跟4加起來
```
## 函式陳述式 & 函式表達式
### 函式陳述式 Function statement
藉由直接給定名字來直接宣告一個函式,JS幫你保留記憶體空間
<font color='red'>
**整個函式內容在語法解析階段都會保留進記憶體空間**
**函式宣告在全域環境具有 提升 (Hoisting) 的效果,能在宣告之前呼叫函式。**
</font>
```=javascript
gogo();
function gogo(){
//do something
}
```
### 函式表達式 Function expression
把一個匿名函式指派給一個變數
這種宣告方式的函式內容不會在一開始就被提升 (Hoisting),會被提升的只有該變數而已。
<font color='red'>
**執行階段,才會把函式內容指派給變數**
</font>
```=javascript
var functionExpression = function(){
//doSomeThing
}
```
### 什麼是提升 Hoisting?
簡單來說,提升是JS裡面獨特的行為,<font color='red'>**宣告一個變數或是函式之前,就先使用它,而且不會出錯**</font>
```=JavaScript
catName("danny123");
function catName(name) {
console.log("My cat's name is " + name);
}
/*
上面程式的結果是: "My cat's name is danny123"
*/
```
詳細內容傳送門1: [JS 原力覺醒 Day06 - 提升 Hoisting](https://ithelp.ithome.com.tw/articles/10218457)
詳細內容傳送門2: [提升(Hoisting)](https://developer.mozilla.org/zh-TW/docs/Glossary/Hoisting)
## 參考資料
[Weird-JavaScript 20:函式陳述式與函式表達式](https://luffy.website/2019/08/15/weird-JavaScript-20/)
[陳述式與宣告](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements)
[JS 原力覺醒 Day07 - 陳述式 表達式](https://ithelp.ithome.com.tw/articles/10218937)
[運算式與運算子](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Expressions_and_Operators#%E9%81%8B%E7%AE%97%E5%BC%8F)
[提升(Hoisting)](https://developer.mozilla.org/zh-TW/docs/Glossary/Hoisting)
[JS 原力覺醒 Day06 - 提升 Hoisting](https://ithelp.ithome.com.tw/articles/10218457)