# <font class="h2">參數parameters</font>
###### tags: `javascript`
<style>
.h2 {
background: linear-gradient(135deg,#fff,#537479) ;
color: #537479;
display:block;
padding: 6px 5px;
border-radius: 4px;
}
.h3 {
background: linear-gradient(180deg,#fff 50%,#c9d5d4) ;
color: #537479;
display:block;
padding: 6px 5px;
border-bottom: 3px solid #537479;
}
.h4 {
color: #537479;
font-weight:bold;
font-size:1.1em;
}
</style>
### <font class="h3">默認參數</font>

<br><br><br><br>
### <font class="h3">參數範例</font>
**範例一:**
```javascript
var globalVariable = '全域變數'
var obj = {
aFunction:function(para){
var localVariables = '全域變數';
console.log(para,localVariables,arguments,this,globalVariable)
}
}
obj.aFunction('一段描述',2,3);
```

我們雖然傳入三參數,但function只會接收一個參數,且是第一個參數,因此印出「一段描述」。
`localVariables`是函式內定一的變數,因此印出「全域變數」。
`arguments`是無論我們傳入多少參數,它都可以全部接收,`arguments`是個「類陣列」。
`globalVariable`函式內沒有定義,所以會向外找,因此印出「全域變數」。
<br><br>
**範例二:**
```javascript
function callMore(d,c,b,a){
console.log(d,c,b,a);
}
var a = 'a';
var b = 'b';
var c = 'c';
callMore(a,b,c);//a,b,c,undefined
```
參數的名稱是可以自己定義的`d,c,b,a`
如果傳入的值數量不足,後面都會以`undefined`呈現
<br><br>
**範例三-函式傳入物件:**
```javascript
function callObject(obj){
obj.name = '杰倫家'
};
var family = {
name:'小明家'
}
callObject(family);
console.log(family);//{name: '杰倫家'}
```
傳入參數如果是傳物件,它依然會維持傳參考特性。
`callObject`將`family`物件傳入function,修改了`name`屬性的值,因此原本`family`物件`name`屬性的值也會連動。
<br><br>
**範例四-函式傳入函式:**
```javascript
function aaa(fn){
fn('小明');
}
aaa(function(a){
console.log(a);
})//小明
```
函式`aaa`帶入函式a,因此`小明`就會傳遞到外層來印出
<br><br>
**範例五-callback function:**
```javascript
function callSomeone(name,a){
console.log(name+'你好',a)//小明你好1
}
function aaa(fn){
fn('小明',1);
}
aaa(callSome)
```
實際執行的並不是function`aaa`,實際執行的是`fn('小明',1)`,這種呼叫方式就叫callback function
<br><br>
**範例六-arguments**
```javascript
function callArg(a){
console.log(a,arguments);
}
callArg(1,2,3,'4')
```

```javascript
function callArg(a) {
console.log(a, arguments);
for (let index = 0; index < arguments.length; index++) {
console.log(arguments[index]);//1,2,3,4
}
}
callArg(1, 2, 3, '4')
```
arguments是類陣列,並不是一個純陣列,它可以對它做一些基本的陣列操作,如for迴圈
```javascript
function callArg(a) {
console.log(a, arguments);
arguments.forEach(function(){
})
}
}
callArg(1, 2, 3, '4')
```
但如果使用forEach就會出錯
<br><br>
### <font class="h3">hoisting是否會影響參數運行</font>
```javascript
function callName(a){
console.log(a);
var a;
console.log(a);
a = '杰倫';
console.log(a);
}
callName('小明')
```

<br>
現在加入一個函式`a`
```javascript
function callName(a){
console.log(a);
function a(){
}
var a;
console.log(a);
a = '杰倫';
console.log(a);
}
callName('小明')
```


`funtion a()`一樣會移到`console.log(a)`之前,它並不會比傳進來的參數更前方,如果要是它比傳進來的參數更前方,它就會維持印出小明,也就是說`a`在傳入時就已經定義好了。
所以`hoisting`不會影響`a`的值,除非是覆蓋這值如`a = '杰倫';`
<br><br>