首先我們先看一個範例
function fn(para){
    console.log(para, arguments);
};
fn('weiwei', 2, 3);

範例中我們設立一個參數 para,當我們傳入三個參數時,
只會接收到第一個傳入的參數 weiwei,
而 arguments 會將傳入的參數全部接收,
會形成一個 arguments 的類陣列,
我們將內容點開後,能發現它的結構跟陣列很像

當我們在函式中宣告一個變數名稱和參數名稱相同時會如何呢?
function fn(a){
    console.log(a);
    
    var a;
    
    console.log(a);
    
    a = 'weiwei';
    
    console.log(a);
};
fn('ming');

我們能看見參數 a 只有最後一個回傳 weiwei,
在函式中我們宣告的變數名稱和參數一樣時,
因為變數 a 已經存在,因此 var a 會無效,所以第二個 a 會回傳 ming,
而第三個 a 的結果為 weiwei 的原因是因為在 a = 'weiwei' 時,
a 的值已經被修改成 weiwei 了,
因此結果才會回傳 weiwei
當我們在函式中宣告一個函式名稱和參數名稱相同時會如何呢?
function fn(a){
    console.log(a);
    
    function a() {};
    
    console.log(a);
    
    a = 'weiwei';
    
    console.log(a);
};
fn('ming');

此時前兩個 a 為 function,第三個為 weiwei,
這表示 a() 會因提升(hoisting)效果跑到最前端,
因此可以得知在函式中的 a() 執行時,會在參數傳入之後才進行,
function callMe(d, c, b, a) {
    console.log(d, c, b, a);
};
callMe('a', 'b', 'c');

該範例可以了解到參數的名稱可以自己定義,
而參數的名稱與傳入的值沒有任何關係
callback function 是將函式當成參數給另一個函式使用
function fnA(name, a) {
    console.log(`${name}你好${a}`);
};
function fnB(fn) {
    fn('weiwei', '阿');
};
fnB(fnA);

在執行 fnB(fnA) 時,我們會先將 fnA 的參數設定在 fnB 函式內,
而此時 fnA 這個函式會在 fnB 中執行