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

所以說用宣告的方式其實沒辦法覆蓋掉的,如果想要覆蓋掉就直接定義一個新的值給 a。
下面還有另一個例子
1 2 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是會把小明這個值覆蓋掉的。
物件參數
1 2 3 4 5 6 7 8
| function callObject(obj) { obj.name = '杰倫家'; }; var family = { name: '小明家' }; callObject(family); console.log(family); // 杰倫家
|
在函式參數當中如果是物件的話,還是會維持原本傳址的特性,所以 family 才會跟著被變動了。
callback function
1 2 3 4 5 6
| function functionB(fn) { fn('小明'); } functionB(function (a) { console.log(a); // 小明 });
|

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

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