# Expressions versus statements in JavaScript
###### tags: `Javascript`
ref: https://2ality.com/2012/09/expressions-vs-statements.html
## Statements and expressions
> An expression produces a value and can be written wherever a value is expected
expression 會產出值,或是可以期待他會代表一個值
* myvar 變數顯然是 expression 因為它可以代表一個值
* 3 + x 可以產出值
* myfunc("a", "b") 可以期待他產出值
> Roughly, a statement performs an action. Loops and if statements are examples of statements.
大體上, statement 是一個動作,比方說 Loops 或是 if statements
有個很重要的特性必須注意:
沒有辦法在需要使用 expression 的地方使用 statement ,比方說在 function 需要參數的地方(也就是帶入變數 expression 的地方)使用 statement 是不可行的。
然而,反過來說卻可以這樣操作,這樣的 statement 稱作 expression statement
## Similar kinds of statements and expressions
### If statement versus conditional operator
這邊的相似之處直接以 conditional operator 做範例,他們可以做到一樣的效果,然而上方的 if statement 是 statement ,然而下方的等號以及分號之間則是 expression
if statement
```javascript
var x;
if (y >= 0) {
x = y;
} else {
x = -y;
}
```
conditional operator
```javascript
var x = (y >= 0 ? y : -y);
```
### Semicolon versus comma operator
在 expression 中,使用 comma 逗號可以做到這樣的效果,會 return 第二個值
```javascript=
> "a", "b"
'b'
> var x = ("a", "b");
> x
'b'
> console.log(("a", "b"));
b
```
## Expressions that look like statements
那些看起來像 statements 的 expression
### Object literal versus block
下方是一個 object literal 用來創造物件,也就是他代表一個值所以他是 expression
```javascript
{
foo: bar(3, 5)
}
```
但有趣的是,他同時也是一個 statement
* A block: a sequence of statements in curly braces.(物件的內容是一個動作也就是 statements)
* A label: you can prefix any statement with a label. Here the label is foo.
* A statement: the expression statement bar(3, 5).(一個 expression statement 的意思是可以代表值的動作)
### Function expression versus function declaration
> A function expression produces a value (the function).
> A function declaration leads to an action – the creation of a variable whose value is the function.
* 一個 function expression 會 return 值
* 一個 function declaration 會引導一個 action ,並且其創造的變數的值就是一個函式見下方範例
```javascript=
> var fac = function me(x) { return x <= 1 ? 1 : x * me(x-1) }
> fac(10)
3628800
> console.log(me)
ReferenceError: me is not defined
```
並且 function expression 是可以直接呼叫使用的,然而 function declaration 則必須帶入參數才可以使用。