在高階程式語言裏面的函數宣告,參數都可以用byval byref來將參數設定為傳值或傳位(也有人說是傳址,反正就是傳入參數的位址啦)。但javascript是個死硬派,堅持所有的參數都是傳值,只有物件才是傳位(事實上是物件這個變數裏面只保留了物件的位址,而我們拿的時候因為是物件所以直接就變成物件了,根本上還是傳值啦)。那麼有甚麼方法可以讓javascript傳回多個值呢?

第一種方法,使用全域變數,這個方法是簡單,但是很呆,如果這樣的東西一多,你的全域變數就滿街跑了。應該不用寫範例吧。

第二種方法,使用陣列方式傳回。舉例:

function Foo() {
  return [true,'something'];
}
result = Foo();
alert(result(1));

第三種方法比第二種聰明一點,使用json陣列。舉例:

function Foo() {
    return {val1:true, val2:'something'};
}

result = Foo();
alert(result['val1']);
第四種方法,使用callback函數技巧。舉例:

function Foo(callback) {
    callback(false,'something');
}

function FooCallback(val1, val2) {
    alert(val2);
}

Foo(FooCallback);

也可以不用宣告callback函數,直接使用匿名函數(用了jQuery之後常常見到),例如:

function Foo(callback) {
    callback(false,'something');
}

Foo(new function(val1,val2) { alert(val2); }

第五種方法,寫一個類來存放參數。物件裏面的屬性就是參數值。舉例:

function FooArg() {  //宣告物件
    this.val1 = true;  //宣告屬性
    this.val2 = '';
}

function Foo(arg) {
    arg.val1 = false;
    arg.val2 = 'something';
}

arg = new FooArg();
Foo(arg);
alert(arg.val2);

也可以不用宣告直接用一個匿名類(用了jQuery之後常常見到)參數的方式。舉例:

function Foo(arg) {
    arg.val1 = false;
    arg.val2 = 'something';
}

arg = new function() {this.val1=true; this.val2='';};
Foo(arg);
alert(arg.val2);

實際應用上各有好處,端看你要怎麼用它。上面的例子沒有經過測試,不過大概就是那個樣子。

創作者介紹

人生四十宅開始 二號宅

漠哥 發表在 痞客邦 留言(0) 人氣()