# <font class="h2">arguments</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>
:::info
每個函式都有this和argument這兩個特別的值,
:::
當函式被呼叫的時候,會產生一個arguments物件(注意是物件非陣列)。
而這個arguments物件的內容,實際上就是我們呼叫函式所帶入的參數。
```javascript
const plus = function (numA,numB){
return numA + numB;
}
plus(1,2,3,4,5)
```
很明顯我們帶入的參數數量,超過了原先定義好的參數數量,但回傳的仍是1+2的結果,那麼多餘的3、4、5這些參數,透過aruments這個物件我們有辦法在函式內取得。
<br>
:::info
arguments雖然看起來像個「陣列」,但實際上它只是個帶有「索引」特性的物件,然後內建個length屬性,其他地方與「陣列」完全不同,當然也沒有`.map()`或`.filter()`
==箭頭函式是無法使用arguments物件的==
:::
```javascript
const plus = function(){
let num = 0;
for(var i = 0 ; i<arguments.length ; i++){
num += arguments[i];
}
return num
}
plus(1,2,3,4) //10
```
現在我們可以利用arguments物件讓這個plus函式變得更有彈性。
<br><br><br><br>
### <font class="h4">➤遞迴(在函式內自我呼叫)</font>
當我們需要在函式執行「遞迴」時,可以透過執行`arguments.callee()`來達成,這個屬性在「匿名函式」時特別有用。
但要小心的是,在「嚴格模式」下不允許存取`argument.caller`和`arguments.callee`這兩個屬性
```javascript
const plus = function(numA,numB){
console.log(arguments.callee === plus);
}
plus() //true
```
<br><br><br><br>
### <font class="h4">➤將類陣列轉為陣列</font>
### 方法一.使用展開
```javascript
const plus = function (numA,numB){
let newPlus = [...plus.arguments]
console.log(newPlus)
}
plus(1,2,3,4,5)
```
<br><br>
### 方法二.使slice
```javascript
const plus = function (numA,numB){
const args = Array.prototype.slice.call(arguments)
console.log(args)
}
plus(1,2,3,4,5)
```
或是
```javascript
const plus = function (numA,numB){
const args = [].slice.call(arguments)
console.log(args)
}
plus(1,2,3,4,5)
```
<br><br>
### 方法三.ES6的Array.from
```javascript
const plus = function (numA,numB){
const args = Array.from(arguments)
console.log(args)
}
plus(1,2,3,4,5) //[1, 2, 3, 4, 5]
```
<br><br><br><br>
### 方法四.使用for迴圈
```javascript!
function build() {
var args = new Array();
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
args.forEach(function(item) {
console.log(item);
});
}
build(10, 20, 30)
```
<br><br><br><br>
### <font class="h3">arguments.callee</font>
arguments.callee指向的是當下的函式本身,(但嚴格模式不勻許使用arguments.callee)
```javascript
function aaa() {
console.log(arguments.callee);
}
aaa()
```

<br><br><br><br>
---
https://dean34520.medium.com/%E7%90%86%E8%A7%A3-javascript%E4%B8%AD%E7%9A%84arguments-%E8%88%87-parameters-5028336976f6