Core JavaScript 1.5 Guide:Functions
出典: MDC
目次 |
[編集] 関数の定義
関数の定義は以下の関数のキーワードからなります。
- 関数の名前。
- その関数への引数のリスト。丸括弧でくくり、コンマで区切る。
- その関数を定義する JavaScript の文。波括弧 {} でくくる。関数内の文はそのアプリケーション内で定義された他の関数を呼び出すことができる。
[編集] 簡単な例
例えば、次のコードは square という名前の簡単な関数を定義します。
function square(number) {
return number * number;
}
関数 square は引数を 1 つとり、その名前は number です。この関数は、その引数の 2 乗を返すように指示する 1 つの文からなります。return 文は関数が返す値を指定します。
return number * number
プリミティブなパラメータは値渡しで関数に渡されます。つまり、その値は関数に渡されますが、その関数がそのパラメータの値を変更しても、この変更はプログラム全体や呼び出し元の関数では反映されません。
オブジェクト(すなわち 非プリミティブ値、例えば配列やユーザ定義オブジェクトなど)をパラメータとして渡すと、そのオブジェクトへの参照が関数に渡されます。つまり、その関数がそのオブジェクトのプロパティを変更した場合、その変更はその関数外でも有効です。次の例をご覧ください。
function myFunc(theObject) {
theObject.make="Toyota";
}
var mycar = {make:"Honda", model:"Accord", year:1998};
var x=mycar.make; // Honda を返す
myFunc(mycar);
var y=mycar.make; // Toyota を返す(プロパティがその関数で変更されている)
パラメータにオブジェクトを新たに代入しても呼び出し元には影響がないことに注意してください。
function myFunc(theObject) {
theObject = {make:"Ford", model:"Focus", year:2006};
}
var mycar = {make:"Honda", model:"Accord", year:1998};
var x=mycar.make; // Honda を返す
myFunc(mycar);
var y=mycar.make; // やはり Honda を返す
[編集] 条件付きの関数定義
ある条件に基づいて関数を定義することもできます。例えば、次の関数の定義をご覧ください。
if (num == 0)
{
function myFunc(theObject) {
theObject.make="Toyota"
}
}
変数 num が 0 に等しい場合のみ myFunc という関数が定義されます。num が 0 に等しくない場合はその関数は定義されず、その関数を実行しようとしても失敗します。
[編集] 関数式
関数は式の中で定義することもできます。これは関数式と言います。一般的にこのような関数は無名です。名前を付けなくてもいいのです。例えば、関数 square は次のように定義できます。
var square = function(number) {return number * number};
この方法はある関数を別の関数の引数として渡すときに便利です。次の例では map 関数を定義し、第 1 パラメータとして無名関数を指定して呼び出します。
function map(f,a) {
var result=new Array;
for (var i = 0; i != a.length; i++)
result[i] = f(a[i]);
return result;
}
次の呼び出し
map(function(x) {return x * x * x}, [0, 1, 2, 5, 10]);
は、[0, 1, 8, 125, 1000] を返します。
[編集] 関数の呼び出し
関数を定義してもその関数は自動的に実行されるわけではありません。関数を定義するということは単に関数に名前を付け、その関数が呼び出されたときに何をするかを指定することです。関数の呼び出しとは、実際には指定したパラメータを用いて指定した動作を実行するということです。例えば、関数 square を定義した場合、次のようにしてそれを呼び出すことができます。
square(5)
この文は 5 という引数とともに関数を呼び出します。関数はその関数の文を実行し、25 という値を返します。
関数の引数は文字列や数値に限られているということはありません。オブジェクト全体を関数に渡すこともできます。show_props 関数(オブジェクトとプロパティ で定義)はオブジェクトを引数にとる関数の例です。
関数は再帰的にすることもできます。つまりある関数がその関数自身を呼び出すこともできるということです。例えば、ここに階乗を計算する関数を示します。
function factorial(n) {
if ((n == 0) || (n == 1))
return 1;
else {
var result = (n * factorial(n-1) );
return result;
}
}
1 から 5 までの階乗の計算は次のようになります。
a=factorial(1); // 1 を返す b=factorial(2); // 2 を返す c=factorial(3); // 6 を返す d=factorial(4); // 24 を返す e=factorial(5); // 120 を返す
[編集] arguments オブジェクトの使用
関数の引数は配列のようなオブジェクトで管理されます。関数内では、次のようにして渡された引数を指すことができます。
arguments[i]
ここで i は引数の順序を表す数を指します。これは 0 から始まります。関数に渡された第 1 引数は arguments[0] となります。引数のトータルの数は arguments.length で示されます。
arguments オブジェクトを使用すると、宣言時の仮引数の数よりも多くの引数を使って関数を呼び出すことができます。これはその関数に渡す引数の数が前もってわかっていない場合に役立ちます。arguments.length を使用することで実際にその関数に渡された引数の数を特定することができます。また、arguments オブジェクトを使用することで各引数を扱うことができます。
例えば、複数の文字列を連結する関数を考えます。この関数の仮引数は、連結するアイテムを区切るのに用いる文字列のみです。この関数は次のように定義されています。
function myConcat(separator) {
var result = ""; // リストを初期化する
// 引数について繰り返し
for (var i = 1; i < arguments.length; i++) {
result += arguments[i] + separator;
}
return result;
}
この関数に引数をいくつも渡すことができます。そして各引数を文字列のリストに連結します。
// "red, orange, blue, " を返す
myConcat(", ", "red", "orange", "blue");
// "elephant; giraffe; lion; cheetah; " を返す
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
// "sage. basil. oregano. pepper. parsley. " を返す
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
さらなる情報については、コア JavaScript リファレンスの Function オブジェクト をご覧ください。
JavaScript 1.3 以前のバージョン
arguments オブジェクトは Function オブジェクトのプロパティであり、次のように関数の名前を前に付けることができます。
functionName.arguments[i]
[編集] 定義済み関数
JavaScript にはトップレベルの定義済み関数がいくつかあります。
- eval
- isFinite
- isNaN
- parseInt と parseFloat
- Number と String
- encodeURI と decodeURI、encodeURIComponent、decodeURIComponent(すべて Javascript 1.5 以降で使用可能)
[編集] eval 関数
eval 関数は JavaScript のコードの文字列を特定のオブジェクトを参照することなく評価します。eval の構文は次のとおりです。
eval(expr)
ここで expr は評価される文字列です。
文字列が式を表している場合は eval はその式を評価します。また、1 つ以上の JavaScript の文を表している場合は eval はその式を実行します。eval のコードのスコープは呼び出し元コードのスコープと同じです。演算式を評価するために eval を呼び出さないでください。JavaScript は自動的に演算式を評価します。
[編集] isFinite 関数
isFinite 関数は引数を評価し、その引数が有限数であるかどうかを決定します。isFinite の構文は次のとおりです。
isFinite(number)
ここで number は評価する数値です。
引数が NaN、正の無限大、または負の無限大である場合、このメソッドは false を返し、そうでない場合は true を返します。
次のコードはクライアントの入力をチェックし、それが有限数であるかどうかを決定します。
if(isFinite(ClientInput))
{
/* 適当な処理 */
}
[編集] isNaN 関数
isNaN 関数は引数を評価し、その引数が "NaN"(not a number; 非数)であるかどうかを決定します。isNaN の構文は次のとおりです。
isNaN(testValue)
ここで testValue は評価したい値です。
parseFloat および parseInt 関数は非数値を評価したときに "NaN" を返します。isNaN は "NaN" が渡された場合は true を、そうでない場合は false をそれぞれ返します。
次のコードは floatValue を評価し、それが数値であるかを決定し、その結果に応じてプロシージャを呼び出します。
floatValue=parseFloat(toFloat)
if (isNaN(floatValue)) {
notFloat()
} else {
isFloat()
}
[編集] parseInt および parseFloat 関数
2 つの「パース」関数、parseInt および parseFloat は、引数に文字列が与えられたときに数値を返します。
parseFloat の構文は次のとおりです。
parseFloat(str)
parseFloat はその引数である str という文字列をパースし、浮動小数点数を返そうとします。符号(+ または -)、数字 (0-9)、小数点、または指数以外の文字に出くわすと、そこまでの値を返し、その文字とその後に続くすべての文字を無視します。最初の文字が数に変換できない場合は "NaN"(not a number; 非数)を返します。
parseInt の構文は次のとおりです。
parseInt(str [, radix])
parseInt はその第 1 引数である str という文字列をパースし、指定した radix(基数)の整数を返そうとします。radix はオプション的な第 2 引数です。例えば、10 という基数では 10 進数に変換し、8 では 8 進数、16 では 16 進数というように変換します。10 より大きな基数ではアルファベットで 9 より大きい数を表します。例えば 16 進数(基数 16)では A から F が使用されます。
parseInt は指定した基数での数値ではない文字に出くわすと、その文字とその後に続くすべての文字を無視し、それまでにパースした整数の値を返します。最初の文字が指定した基数の数に変換できない場合は "NaN" を返します。parseInt 関数は文字列を切り捨てて整数の値にします。
[編集] Number および String 関数
Number および String 関数はオブジェクトを数値や文字列に変換します。これらの関数の構文は以下のとおりです。
Number(objRef) String(objRef)
ここで objRef はオブジェクト参照を表します。
次の例では Date オブジェクトを理解できる文字列に変換します。
D = new Date (430054663215) // 次の文字列が返される // "Thu Aug 18 04:37:43 GMT-0700 (Pacific Daylight Time) 1983" x = String(D)
[編集] escape および unescape 関数
escape および unescape 関数は文字列をエンコードしたりデコードしたりします。escape 関数は ISO Latin 文字セットで表された引数の 16 進エンコーディングを返します。unescape は指定した 16 進エンコーディングの値に対する ASCII 文字列を返します。
これらの関数の構文は以下のとおりです。
escape(string) unescape(string)
これらの関数は主にサーバサイド JavaScript で URL 中の名前と値のペアのエンコードやデコードに使用されます。
escape および unescape 関数は 非 ASCII 文字に対しては正しく機能せず、廃止予定になっています。JavaScript 1.5 以降では encodeURI、decodeURI、encodeURIComponent および decodeURIComponent を使用してください。