関数の利用
1. 関数
 javascriptであらかじめ定義されている関数(組み込み関数,ビルドイン関数)は,ユーザが呼び出すだけで使えますが,それ以外の関数は呼び出す前に定義しなければなりません.
 関数を定義するには function文を書きます.これに対して,関数を呼び出す(実行する)ときはfunctionを付けません.
【ビルドイン関数の例】
parseInt(str, radix)は第1引数strで与えられる文字列を第2引数radixを基数とする整数と見なしたとき,その数を10進数に変換した数を返します.
nn = parseInt('ff',16);
document.write(nn);←16進数のffを10進数に直すと255になる.
【ビルドイン・オブジェクトの例】…オブジェクトの中に置かれている関数はメソッドと呼ばれ,オブジェクト名.メソッド名()の形で呼び出せる.
Math.floor(引数)は引数で与えられた数の小数部分を切り捨ててできる整数を返します.
nn = Math.floor(3.14);
document.write(nn);←3になる.

2. 関数の定義
 C言語やjavascriptでは,細かく分けた作業を行う関数を部品のように組み合わせて,全体の作業を記述するスタイルでプログラムを作ります.個々の部品がしかっりできていることが全体の良し悪しに反映するので,C言語やjavascriptを使う上で,関数の利用は最も重要なことです.
【関数の定義の仕方】
function 関数名(引数1, 引数2, ..)//@
{処理;//A
return 戻り値;//B
}//C

【関数の呼び出し方】
関数名(引数1, 引数2, ..);//D
@.1 ≪必須≫関数を定義するには,必ずキーワードのfunctionを書かなければなりません.
【例1】 function abc1()
@.2 ≪必須≫関数を呼び出すときには名前で呼び出すので,関数には名前を付けます.
関数の名前は変数の名前と同様に,半角文字(1バイト文字)のアルファベット(大文字小文字の区別あり),アンダーバー,数字で書きます.先頭の文字に数字は使えません.また,javascriptの予約語やビルドイン関数,ビルドインオブジェクトのメソッド名と重複しないように,1つの英単語だけからなる関数名は避ける方がよいでしょう.2つ以上の単語をアンダーバーでつなぐいだり,数字を付けると安全です.
【例2】 function num_amari() , function num1()
@.3 関数には複数個の引数をカンマ( , )で区切って指定できますが,引数無しの関数もあります.その場合でも関数名の後には括弧 ( )が必要です.
@.4 引数無しの関数でreturnで戻り値がある場合もあり,引数なしで戻り値もないという場合もあります.

戻り値あり戻り値なし



【例3】
function aa1(xx1, yy1)
{ return xx1 * yy1;
}
関数呼び出し
zz1 = aa1(3, 4);
document.write(zz1);
→12になる
【例4】
function is_plus(xx1)
{ if(xx1 > 0)
document.write(xx1);
else
return;
}
関数呼び出し
yy1 = is_plus(0);
document.write(yy1);
→undefinedになる



【例5】
function seki1()
{var xx1 = 2;
var yy1 = 3;
return xx1 * yy1;
}
関数呼び出し
zz1 = seki1();→zz1は6になる
【例6】
xx1 = 0;
yy1 = 2;
function heihou1()
{ xx1 = yy1 * yy1;
}
関数呼び出し
heihou1();→xx1は4になる
 【例5】のように,関数の内部で定義された局所変数で書かれた式を戻り値にした場合でも,その値は関数から返される.
 【例6】のように,関数の外部で定義されている大域変数を書き換えると,return文による戻り値を使わなくても関数を実行するだけでその効果が外側に及ぶ.
 しかし,そのように大域変数を幾つもの関数から書き換えると,変数を管理しにくくなるので,この使い方はできれば避けた方がよい.

@.5 引数には,仮の名前で変数名を付けておき,関数本体での処理にその仮の変数名を生かします.引数にとって重要なことは,仮の名前が何であるかということではなく,第1引数,第2引数,…のように「何番目の引数」であるかということです.
【例】
function num_amari(aa1, bb1)
{rr1 = aa1 % bb1;//% 演算子は余りを返します
return rr1;
}
このとき,num_amari(17, 9);のように関数を呼び出すと,17を9で割った余り8を返します.
@.6 関数を定義するときに,( )の後ろにセミコロン( ; )を付けてはいけません.
【例】
function abc1(xx1, yy1);//←エラーになる
{return xx1 * yy1;
}
このエラーを防ぐ1つの工夫として,次のようにカーニハン&リッチ風に書く方法がある.
【例】
function abc1(xx1, yy1){
return xx1 * yy1;
}
ただし,中かっこ{ }の始まりと終わりの対応関係が分かりにくいので,この教材の管理人はK&Rスタイルを採用していない.
これに対して,Dの関数を呼び出すときは,関数名の後ろにセミコロン( ; )を付ける場面は多い.
【例】
function abc2()
{…
}
xx1 = abc2();←セミコロンを付ける
if(abc2() == 1)//←セミコロンなし
xx2 = 0;
AC if分岐やforループでは,処理の内容が単文の場合に中かっこ{ }を付けないことも可能ですが,関数定義の場合,関数で行う処理の始まりと終わりは中かっこ{ }で囲みます.ブロックの終わりの } にはセミコロン( ; )を付けません.
B.1 関数にはreturn文を付けることができます.returnに使われた値は関数を呼び出したときに,外側に返されます.
関数の内部で定義された局所変数であっても,return 変数;とすると,変数の値は関数の外に返されます.
return;のみで値を返さないこともできますが,その場合は関数を呼びだしたときの戻り値は未定義になり利用できません.
関数の中で制御の流れがreturn文に至ると関数の実行は打ち切られます.
【例】 1次方程式 ax=b の解を求めています.
function eq2(aa1, bb1)
{if(aa1 == 0 && bb1 == 0)
return true;
else if(aa1 ==0 && bb1 !=0)
return false;
else
return bb1/aa1;
}
B.2 returnで返されるのは1つの値です.ここまでに述べた普通の方法で,1つのreturn文で2つ以上の値を返すのは無理です.
【例】 ある関数で,a÷bの計算をして,商と余りを求めたとき,これら商も余りも戻り値として返すことはできません.
D.1 関数の定義が書かれているだけでは関数は実行されません.関数が実行されるのは,functionを付けずに関数名が書かれた場所に制御が移ったときです.
【例】
xx1 = 0;
yy1 = 2;
function heihou1()
{ xx1 = yy1 * yy1;
}
document.write(xx1);→関数heihou1()はすでに定義されているが,まだ実行されていないので,xx1の値は0のまま
D.2 関数に戻り値があるときは,関数を右辺としてその戻り値を変数に代入することはできるが,関数を代入式の左辺に書くことはできない.
比較演算子 == や <, >の左辺に置くことはできる.
【例】
function aa1(xx1, yy1)
{ return xx1 * yy1;
}
関数呼び出し
zz1 = 0;
aa1(3, 4) = zz1;←エラーになる

【例題1】
 1つの数値を引数として受け取り,その3乗を返す関数を作り,17の3乗を表示してください.
(答案例)
→4913
【例題2】
 2つの整数を引数として受け取り,大きい方(等しいときはどちらでもよい)の数を返す関数を作ってください.その関数を2回使って,3つの数 1.41, 2.71, 1.56の最大値を求めて表示してください.
(答案例)
→2.71
【例題3】
 大域変数を4個用意して,そのうち初めの自然数を2つ目の自然数で割ったときの商と余りを残り2つの大域変数に代入するプログラムを作ってください.
 その関数を使って,2345を117で割ったときの商と余りを表示してください.
 なお,初めに与えられる数は必ず自然数になり,そうでない場合(小数や負の数である場合)のエラー処理は不要とします.
(答案例)
商は20で余りは5になります