Section 1.18 引数の渡し方

今回は引数の渡し方について見ていくね。
引数の渡し方って?
例えばこういうスクリプト。

// plus 関数を定義します
function plus(x, y)
{
    x += y;
    return x;
}

var x = 1, y = 2;
var x_plus_y = plus(x, y);  // x と y を引数にして plus 関数を呼び出します

System.inform("x = " + x + ", y = " + y + ", x + y = " + x_plus_y);

このスクリプトを実行すると、何て表示されると思う?
えっ?
…えっと、plus っていう関数は、xy を引数として受け取って、 xy を足してから x の値を返してるんだよね。
そだね。
まず x1y2 で初期化して…
それから xy を引数にして plus 関数を呼ぶんだから、 x_plus_y1 + 23 になるよね。
うんうん。
あと、x には y の値が足されてるから 3 で、y2 のまま。
だから、「x = 3, y = 2, x + y = 3」って表示されるんじゃないかな。
じゃあ確かめてみよっか。
うん、それじゃ実行してみるね。

<実行結果>

表示されたメッセージ「x = 1, y = 2, x + y = 3」

あれっ、x = 1 って表示されてるよ?
実は plus 関数の引数になってる x は、呼び出し元の plus(x, y)x とは別の変数なんだ。
えっ、そうなの?
うん。関数が実行される時に、引数の x に呼び出し元の x の値がコピーされてるんだ。
だから関数の中で x の値を書き換えても、呼び出し元の x は変わらないってワケ。
へぇ、そうなんだ…
ただし!
えっ、なに??
引数がオブジェクトの時は、注意が必要なんだ。
例えば、こんなふうに引数が配列の時とか。

// increment 関数を定義します(引数 array には配列を指定します)
function increment(array)
{
    for(var i=0;i<array.count;i++)
        array[i]++;  // 配列の各要素の値を1ずつ増やします
}

var numbers = [1, 2, 3];

increment(numbers);  // 配列 numbers を引数にして increment 関数を呼び出します

// 配列の各要素の値を表示します
for(var i=0;i<numbers.count;i++)
    System.inform("配列の " + i + " 番目の要素は " + numbers[i] + " です。");

このスクリプトを実行すると…

<実行結果(最初に表示されたメッセージ)>

最初に表示されたメッセージ「配列の 0 番目の要素は 2 です」

<実行結果(2番目に表示されたメッセージ)>

2番目に表示されたメッセージ「配列の 1 番目の要素は 3 です」

<実行結果(3番目に表示されたメッセージ)>

3番目に表示されたメッセージ「配列の 2 番目の要素は 4 です」

これって…呼び出し元の配列の要素の値が全部1ずつ増えたってことだよね?
そ。引数がオブジェクトだったら、関数の中でそのオブジェクトに属してる値を変更すると、呼び出し元の値も変わっちゃうんだ。
オブジェクトに属してる値って?
配列や辞書配列だと、各要素の値だね。
あと、例えば Date クラスのオブジェクトだと日付の情報ってことになるね。
Date クラスのオブジェクトを引数として渡すと、関数の中で日付の情報を書き換えられるんだ。
う〜ん、なんかややこしいね…
まぁね。でも TJS ではこうなるって決まってるから、覚えとくしかないかな。
オブジェクトかどうかって、どうやったら判るの?
typeof 演算子で型をチェックすると "Object" になるのがオブジェクト。
typeof 演算子については §1.6 参照ね。
引数って色々難しいんだね…
確かにね。
でも、色んな関数を作っていけば大抵のことは頭に入ると思うよ。
そうなのかなぁ…?
ん、そんなもんだって。
じゃ、今回はここまでね。
今回は短いんだね。
ん、まぁ引数関係は他にもあるんだけど、ここまでで見てきた事が解れば、それなりに関数は作れると思うから。
そうなの?
うん。だから引数の話はとりあえずここまで。
それじゃ、また次回ね。


前へ | TOP | 次へ