処理をまとめて名前で呼び出す - 関数の定義
関数(function)
- 関数とは、何らかの処理をひとつにまとめて「関数名」という名前で呼び出せるようにしたもの
- 関数は「function」キーワードで定義する
- 「Number」など、JavaScriptには予め関数が用意されています
- 関数に渡すなんらかの値を「引数」と呼びます
- 関数の結果は「return文」で返す
- ユーザーが定義する関数を「ユーザー定義関数」と呼びます
function 関数名(引数1, 引数2, ....){
//処理
return 戻り値;
}
関数とメソッド
- 同じような役割ですが、メソッドの場合には特定のオブジェクトと結びついて働きます(documentオブジェクトに対して、write()メソッドを呼び出すように)
- 関数の場合は、オブジェクトに依存せず、関数名だけで呼び出します
組み込み関数
- JavaScriptには特殊な処理を行うために以下のような組み込み関数が用意されています
関数 | 説明 |
---|---|
escape() | 文字列のエンコードを行います |
unescape() | 文字列のデコードを行います |
eval() | 引数をスクリプトとして実行します |
isNaN() | 数値の場合は false、数値でない場合は true を返します |
parseFloat() | 文字列を浮動小数点数に変換 |
parseInt() | 文字列を整数値に変換 |
taint() | フォームの特定の要素を送信可能に設定 |
untaint() | フォームの特定の要素を送信不可能に設定 |
ボタンごとに関数を用意した場合
- 商品Aの関数、商品Bの関数、商品Cの関数を作成
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ボタンごとに関数を用意</title> </head> <body> <h1>税込価格を求める</h1> <p>商品A(1000円)<button onclick="zeiA()">税込価格</button></p> <p>商品B(2000円)<button onclick="zeiB()">税込価格</button></p> <p>商品C(3000円)<button onclick="zeiC()">税込価格</button></p> <script> var zeikomi; var tax = 1.08; function zeiA(){ zeikomi = 1000 * tax; alert('税込価格は' + zeikomi+ '円です'); } function zeiB(){ zeikomi = 2000 * tax; alert('税込価格は' + zeikomi+ '円です'); } function zeiC(){ zeikomi = 3000 * tax; alert('税込価格は' + zeikomi+ '円です'); } </script> </body> </html>
関数を汎用化した場合
- 価格は変数(price)に代入される
- 価格を引数として関数「zei()」に渡す
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>汎用化した関数</title> </head> <body> <h1>税込価格を求める</h1> <p>商品A(1000円)<button onclick="zei(1000)">税込価格</button></p> <p>商品B(2000円)<button onclick="zei(2000)">税込価格</button></p> <p>商品C(3000円)<button onclick="zei(3000)">税込価格</button></p> <script> var zeikomi; var price; var tax = 1.08; function zei(price){ zeikomi = price * tax; alert('税込価格は' + zeikomi+ '円です'); } </script> </body> </html>
商品名、価格を引数とした場合
- 商品名は「name」、価格は「price」に代入される
- 商品名と価格を引数として関数「zei()」に渡す
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>商品名、価格を引数とした場合</title> </head> <body> <h1>税込価格を求める</h1> <p>商品A(1000円)<button onclick="zei('商品A', 1000)">税込価格</button></p> <p>商品B(2000円)<button onclick="zei('商品B', 2000)">税込価格</button></p> <p>商品C(3000円)<button onclick="zei('商品C', 3000)">税込価格</button></p> <script> var zeikomi; var price; var name; var tax = 1.08; function zei(name, price){ zeikomi = price * tax; alert(name+'の税込価格は' + zeikomi+ '円です'); } </script> </body> </html>
ユーザー定義関数
- 自作したオリジナル関数は「ユーザー定義関数」と呼びます
function 関数名 ( 引数1, 引数2, ・・・; ) {
実行される処理
return 戻り値 ;
}
戻り値
- 関数を呼び出す際は、引数により関数へ値を引き渡すことが可能です。「戻り値」はこれと逆の働きをします
- 関数で処理した結果(値)を「関数の呼び出し元」へ返す機能
関数を呼び出す
- 「kansu();」
文字や数値を引数にする
- 「kansu('商品A', 1000);」
- この場合には「戻り値」を返す場所がない
returnで戻り値を返す
- 「戻り値」として返す値を関数内で指定しておく
- 「x = kansu(1000);」
- これを実行する命令が「return」です
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ユーザー定義関数の作成</title> <script> var tax = 1.08; function zei(x){ var x = price * tax; return x; } </script> </head> <body> <script> var price; price = prompt('価格の数字を入力してください。','半角数字で入力'); a = zei(price); alert('税込価格は' + a + '円です'); </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ユーザー定義関数の作成</title> <script> function dollToYen(doll, rate) { var yen; yen = doll * rate; return yen; } </script> </head> <body> <p> <script> var yen1 = dollToYen(100, 90); document.write(yen1, "円<br>"); var doll2 = 50; var rate2 = 88; var yen2= dollToYen(doll2, rate2); document.write(yen2, "円<br>"); </script> </p> </body> </html>
関数とメソッド
- 同じような役割ですが、メソッドの場合には特定のオブジェクトと結びついて働きます(documentオブジェクトに対して、write()メソッドを呼び出すように)
- 関数の場合は、オブジェクトに依存せず、関数名だけで呼び出します
組み込み関数
- JavaScriptには特殊な処理を行うために以下のような組み込み関数が用意されています
関数 | 説明 |
---|---|
escape() | 文字列のエンコードを行います |
unescape() | 文字列のデコードを行います |
eval() | 引数をスクリプトとして実行します |
isNaN() | 数値の場合は false、数値でない場合は true を返します |
parseFloat() | 文字列を浮動小数点数に変換 |
parseInt() | 文字列を整数値に変換 |
taint() | フォームの特定の要素を送信可能に設定 |
untaint() | フォームの特定の要素を送信不可能に設定 |
関数を作る
- 入り口(第1引数:男性か女性、第2引数:身長)
- 出口(標準体重)
- 関数名「sWeight」
- 「MAN」「WOMAN」は定数
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>標準体重</title> </head> <body> <script> function sWeight(man, height) { var weight; // 計算を行う if (man) { weight = (height -80) * 0.7; } else { weight = (height -70) * 0.6; } return weight; //値を返して関数を抜ける } var height; //身長 var weight; //体重 var MAN =1; var WOMAN = -1; //身長が180cmの男性の体重を求める weight = sWeight(1, 180); document.write('<h1>身長が180cmの男性の体重は'); document.write(weight); document.write('kgです</h1>'); //身長が160cmの女性の体重を求める height = 160; weight = sWeight(WOMAN, height); document.write('<h1>身長が', height, 'cmの女性の体重は'); document.write(weight); document.write('kgです</h1>'); </script> </body> </html>
よく使う関数は、外部ファイル化して呼び出します。
変数の有効範囲を知る
- 変数の値が利用できる範囲が決まっています、それを「変数のスコープ」と呼びます
- 関数内で宣言した変数は、関数内部でしか使うことができません。それを「ローカル変数」と呼びます
- 関数外で宣言した変数は、プログラム全体で使うことができます。それを「グローバル変数」と呼びます
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>変数のスコープ</title> <script> function testFunc() { // var num; num = 5; } </script> </head> <body> <h1> <script> var num = 3; testFunc(); document.write(num, "<br>"); </script> </h1> </body> </html>
※この場合、表示されるのはローカル変数に代入された値です。(変数宣言をコメントアウトしているから)
※「testFunc()」は引数を戻さないので「return文」は不要です
- 以下の結果は?
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>変数のスコープ</title> <script> function test() { var num1 = 4; num2 = 5; } </script> </head> <body> <h1> <script> var num1, num2; num1 = 3; num2 = 6; test(); document.write('<p>', num1, '</p>'); document.write('<p>', num2, '</p>'); </script> </h1> </body> </html>
まとめ
- 関数を定義するには、functionキーワードを使用する
- 関数の戻り値は、return文で指定する
- 関数を呼び出すと、実引数が仮引数に代入される
- スコープとは、変数が有効になる範囲
- 関数内で宣言した変数は「ローカル変数」といい、スコープは関数の内部に限定される
- 関数の外で宣言した変数は「グローバル変数」といい、スコープはプログラム全体になる