萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 軟體知識 >  >> 影像處理 >> Flash 教學

ActionScript 函數參數機制深度解析:形參、實參、傳值/傳引用、默認值與不定參數

函數參數是外部數據進入函數作用域的通道。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); // 修改原陣列
}

AS3 參數進階特性

1. 參數默認值

function greet(name:String = "Guest", times:int = 1):void {
    for (var i=0; i
  • 默認值必須是編譯時常量
  • 帶默認值的參數必須放在參數列表末尾

2. 不定參數

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 內部即使用此機制支援任意數量參數

3. 物件字面量替代多參數

// 傳統多參數:易誤、難擴展
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 參數機制:

  1. 統一引用傳遞
  2. 基本類型不可變 → 效果等同傳值
  3. 複雜類型可變 → 真正共享引用
  4. 善用默認值簡化調用、不定參數處理同類數據、配置物件替代長參數列表

理解本質,代碼才能既正確又優雅。

copyright © 萬盛學電腦網 all rights reserved