# 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 則必須帶入參數才可以使用。