代碼示例
window.onload = function() {
var a = 1, b = 2;
plus(a, b);
function plus(a, b) {
a = a + b; // 此處 a 是形參,遮蔽外層 a
b = 0;
// 外層 a,b 不變
}
};
核心規則
- 基本類型(數值、字符串、布爾、null、undefined、Symbol):按值傳遞。函數內修改形參不影響實參。
- 引用類型(對象、數組、函數):按引用傳遞(實際是引用的值傳遞)。函數內修改對象屬性會影響外部;但重新賦值形參(`obj = {}`)不影響外部引用。
驗證代碼
var obj = {a:1, b:2};
function plus(o) {
o.a = o.a + o.b; // 修改屬性 → 外部可見
o.b = 0;
o = {x:99}; // 重新賦值 → 外部不可見
}
plus(obj);
console.log(obj); // {a:3, b:0}
最佳實踐
- 函數參數盡量不可變,需修改時返回新對象。
- 若需修改外部變量,封裝為對象屬性或使用閉包/模塊模式管理狀態。
- ES6 解構賦值、默認參數、剩余參數可減少混淆。