函數參數是外部數據進入函數作用域的通道。ActionScript 3.0 採用統一的引用傳遞語義,但對不可變的基本類型表現為「傳值效果」。掌握參數機制對編寫健壯、高性能、可維護的代碼至關重要。
| 術語 | 定義 | 例子 |
|---|---|---|
| 形式參數 (Parameter) | 函數定義時括號中的變量 | function max(x:int, y:int) 中的 x, y |
| 實際參數 (Argument) | 函數調用時傳入的值/變量/表達式 | max(5, 7) 中的 5, 7 |
| 返回值 | return 語句指定的輸出 | return x > y ? x : y; |
var a:int = 1;
trace("調用前 a =", a); // 1
test(a);
trace("調用後 a =", a); // 1 (未變)
function test(x:int):void {
x += 5;
trace("函數內 x =", x); // 6
}
解析:int 是不可變類型。調用時將值 1 的引用傳給 x。函數內 x += 5 實際創建新整數 6 並讓 x 指向它,原 a 仍指向 1。調用者變量不受影響。
var person:Object = { age: 20 };
trace("調用前 person.age =", person.age); // 20
modify(person);
trace("調用後 person.age =", person.age); // 10 (被修改!)
function modify(per:Object):void {
per.age = 10;
trace("函數內 per.age =", per.age); // 10
}
解析:Object 可變。per 與 person 指向同一堆對象。修改屬性直接影響原對象。調用者對象狀態被改變。
var arr:Array = [1,2,3];
modifyArray(arr);
trace(arr); // 1,2,3,999
function modifyArray(a:Array):void {
a.push(999); // 修改原陣列
}
function greet(name:String = "Guest", times:int = 1):void {
for (var i=0; i
function sum(...args):Number {
var total:Number = 0;
for each (var n:Number in args) total += n;
return total;
}
trace(sum()); // 0
trace(sum(1,2,3)); // 6
trace(sum(10,20,30,40)); // 100
...args 在函數內部是 Array 實例trace 內部即使用此機制支援任意數量參數// 傳統多參數:易誤、難擴展
function distance(x1, y1, x2, y2):Number { ... }
// 物件參數:語義清晰、可選字段、順序無關
function distance(p1:Object, p2:Object):Number {
var dx:Number = p1.x - p2.x;
var dy:Number = p1.y - p2.y;
return Math.sqrt(dx*dx + dy*dy);
}
var d:Number = distance({x:100, y:200}, {x:100, y:100}); // 100
{x:100, y:200} 是物件字面量語法糖,等同於 new Object() 後賦值。
| 場景 | 建議 | 理由 |
|---|---|---|
| 基本類型參數 | 視為只讀,不修改 | 修改無意義且誤導維護者 |
| 複雜類型參數 | 明確文檔:是否修改傳入對象 | 避免隱式副作用,或改為返回新對象 |
| 需修改基本類型 | 返回新值或包裝在物件中 | 如 return {value: newVal} |
| 參數超過 3-4 個 | 改用單一配置物件 | 可讀性、可擴展性、解構賦值友好 |
| 不定數量同類參數 | 使用 ...args 或傳遞 Array/Vector | 統一處理邏輯,避免重載 |
| 性能敏感熱點 | 基本類型傳值無額外開銷;避免大對象頻繁傳遞 | 減少 GC 壓力 |
function f(x:int) { x=5; } 能修改外部變量...args 必須是最後一個參數function f(arr:Array=[]) 會共享同一實例!)ActionScript 3.0 參數機制:
理解本質,代碼才能既正確又優雅。