參數
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | function callName(a){console.log('第一個:' +a);
 
 var a;
 console.log('第二個:' +a);
 a = '杰倫';
 console.log('第三個:' +a);
 };
 callName('小明');
 
 | 
會呈現 ↓

所以說用宣告的方式其實沒辦法覆蓋掉的,如果想要覆蓋掉就直接定義一個新的值給 a。
下面還有另一個例子
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | function callName(a){console.log('第一個:' +a);
 
 function a(){};
 var a;
 console.log('第二個:' +a);
 a = '杰倫';
 console.log('第三個:' +a);
 };
 callName('小明');
 
 | 
會呈現 ↓

原因是因為函式會提升,但是本來定義的小明這個值是在函式的參數上面,而function a是在程式碼片段創造的,所以function a是會把小明這個值覆蓋掉的。
物件參數
| 12
 3
 4
 5
 6
 7
 8
 
 | function callObject(obj) {obj.name = '杰倫家';
 };
 var family = {
 name: '小明家'
 };
 callObject(family);
 console.log(family); // 杰倫家
 
 | 
在函式參數當中如果是物件的話,還是會維持原本傳址的特性,所以 family 才會跟著被變動了。
callback function
| 12
 3
 4
 5
 6
 
 | function functionB(fn) {fn('小明');
 }
 functionB(function (a) {
 console.log(a); // 小明
 });
 
 | 

- 洋紅色: functionB 執行時將函式作為參數傳入 fn,並在 functionB 內執行
- 綠色: fn 的小明作為參數傳遞給 functionB 執行時的函式
這邊換一個範例
| 12
 3
 4
 5
 6
 7
 
 | function callSomeone(name, a) {console.log(name + '你好' + a);
 };
 function functionB(fn) {
 fn('小明', 1);
 };
 functionB(callSomeone); // 小明你好 1
 
 | 
Arguments
| 12
 3
 4
 
 | function callArg(a){console.log(a, argument)
 };
 callArg(1, 2, 3, '4')
 
 | 
回傳呈現 ↓

arguments 是一個類陣列,它可以拿來做 for 迴圈,但是不能拿來做 forEach 之類的功能。