## js函數定義
js使用關鍵字function 定義函數
### 函數聲明
>函數聲明僅在調用時用到
```
function functionName(a,b) {
return a+b;
}
```
>在函數表達式存儲在變量后,變量也可作為一個函數使用:
```
var x = function (a, b) {return a * b};
var z = x(4, 3);
```
上面函數為匿名函數
### Function構造函數
>函數同樣可以通過內置的 JavaScript 函數構造器(Function())定義。
```
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
```
### 函數提升(Hoisting)
1. 在之前的教程中我們已經了解了 "hoisting(提升)"。
2. 提升(Hoisting)是 JavaScript 默認將當前作用域提升到前面去的的行為。
3. 提升(Hoisting)應用在變量的聲明與函數的聲明。
4. 因此,函數可以在聲明之前調用:
```
myFunction(5);
function myFunction(y) {
return y * y;
}
```
>使用表達式定義函數時無法提升。
### 自調用函數
```
(function () {
var x = "Hello!!"; // 我將調用自己
})();
```
### 函數是對象
* 在 JavaScript 中使用 typeof 操作符判斷函數類型將返回 "function" 。
* 但是JavaScript 函數描述為一個對象更加準確。
* JavaScript 函數有 屬性 和 方法。
* arguments.length 屬性返回函數調用過程接收到的參數個數:
```
function myFunction(a, b) {
return arguments.length;
}
```
```
function myFunction(a, b) {
return a * b;
}
var txt = myFunction.toString();
```
>函數定義作為對象的屬性,稱之為對象方法。
>函數如果用于創建新的對象,稱之為對象的構造函數。