> For the complete documentation index, see [llms.txt](https://jen-hsuan-hsieh.gitbook.io/javascript-node-js/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jen-hsuan-hsieh.gitbook.io/javascript-node-js/chapter1/12javascript-quan-gong-lve-ff1a-ke-fu-js-de-qi-guai-bu-fen/123wu-jian-yu-han-shu/12310arguments-yu-spread.md).

# 1.2.3.10.'arguments' 與 spread

* 參數 (arguments)
  * 函數執行時自動建立好
* 在JavaScript中, 參數可以選擇要不要傳入

  境, 放到執行堆中
* 如同前述的[範圍鏈](https://jenhsuan.gitbooks.io/javascript-node-js/content/chapter1/121zhi-xing-huan-jing-yu-ci-hui-huan-jing/1218fan-wei-lian.html), 當執行環境被建立時會產生幾樣東西:
  * 1.變數環境 (Variable environment), 外部環境 (Outer environment)
    * 當在變數環境找不到變數時, 會到所參照的外部環境去尋找
  * 2.this
    * 不須宣告, 由JavaScript engine產生, this依據函數的呼叫方式會指向不同的物件
  * 3.arguments
    * 包含所有傳入函數的參數

```
function greet(firstname, lastname, language){
    console.log(firstname);
    console.log(lastname);
    console.log(language);
}

//印出:
//undefined
//undefined
//undefined
//因為hoisting的緣故, 參數會在執行環境被建立時被給予初始值undefined
greet();

//印出:
//'John'
//undefined
//undefined
greet('John');

//預設函數的寫法

//1.不是每個瀏覽器都支援的做法
function greet(firstname, lastname, language = 'en'){
    console.log(firstname);
    console.log(lastname);
    console.log(language);
}

//2.預設參數的做法
function greet(firstname, lastname, language){
    //如果language是undefined就會被強制轉型為false
    language = language || 'en';
    console.log(firstname);
    console.log(lastname);
    console.log(language);
}

function greet(firstname, lastname, language){
    //如果language是undefined就會被強制轉型為false
    language = language || 'en';
    if (argements.length === 0){
        return;
    }
    console.log(firstname);
    console.log(lastname);
    console.log(language);
    console.log(argements);
}

//印出:
//'John'
//undefined
//undefined
//['John'] (array-like)
greet('John');
```
