JavaScript徹底ガイド|関数の基礎について学ぶ

JavaScript

関数は、オブジェクトと同様にJavaScriptというプログラミング言語を構成するのに重要な要素。
この記事では、関数について基礎的な部分を学びます。

関数とは

JavaScriptの関数は一連の処理をまとめていつでも呼び出せるようにしたものです。JavaScriptの関数は外から見ると数学の関数と変わりありません。入力を与えると出力である関数の値を返します。数学の関数との違いは、入力を受け取ったあとで関数内のプログラムで一定の処理が行われる点です。JavaScriptでは、関数の入力を引数、関数の出力を戻り値といいます。

ワラ

プログラムが大きくなると同じ内容の処理をいろんなところで使うようになってくるんだ。そのときに、同じ処理を一つの関数で一箇所に定義することで、プログラムをすっきりさせることができるんだ!

関数の定義

関数はfunctionキーワードを使って定義します。それに続けて関数につける名前を書き、関数を定義します。

JavaScript
function 関数名() { 処理 }
シンプルになるとこのようになります。
squareという名前の関数で定義してみましょう。
JavaScript
function square(x) { return x*x; }
この関数は、引数の2乗を計算して返します。()の中のxが引数、{}の中のプログラムが関数によって実行される処理となります。例の場合、関数内の処理はreturn文だけとなります。
return文が実行されると、制御が呼び出し元に戻り、return文で指定された値が関数の戻り値となります。

関数名

変数名と同様に、関数名には任意の識別子が使用できます。

ワラ

関数名をつけるときには、その機能を表したわかりやすい名前をつけるようにしよう!関数名をうまくつけることでコメントがなくても何を行なっている処理か読み取ることで、プログラムの可読性や保守性を向上させることができるよ!
名前のつけ方に困ったら以下の記事を参考にしてみてください。『変数名の命名規則』で紹介した記法が役にたちます。
JavaScript JavaScript徹底ガイド|変数と値について学ぶ

関数の呼び出し

関数を呼び出すには、関数名の後に引数を括弧で囲んで記述します。

JavaScript
square(3) // → 9
すると、引数に指定された値「3」が関数定義文に引数xに渡され、{}の中に記述された処理が実行され、return文の値である「9」が戻り値となります。

引数

関数は引数をいくつも入れることができます。必要な分だけ引数を(,)で区切って入れます。

JavaScript
function 関数名(引数1,引数2,...) { 処理 return 返り値; }

関数実行の流れ

関数が呼び出されると、次のような流れで実行されていきます。

  • STEP.1
    呼び出し元の実引数の値が関数定義文の仮引数に代入
  • STEP.2
    関数定義文の{}の中に記述された処理を順番に実行
  • STEP.3
    return文が実行されると呼び出し元に戻り、return文の値が関数の戻り値となる
  • STEP.4
    return文が実行されずに最後のステートメントが実行されると、呼び出し元に戻り、undefinedが関数の戻り値となる

関数宣言文の巻き上げ

関数宣言文は変数宣言文と同じようにプログラムの先頭に巻き上げられます。

JavaScript
console.log(square(5)); // → 25
function square(x) { return x*x; }
上記のように関数を利用した後に関数が定義されていても問題なく実行されるので、関数宣言文はプログラムのどこにでも記述することができます。

引数の値渡しと参照渡し

関数の引数にプリミティブ値を渡す場合と、オブジェクトを渡す場合で、関数の挙動は変わります。

引数がプリミティブ値の場合

JavaScript
function add1(x) { return x = x + 1; }
ver a = 3;
ver b = add1(a);
console.log("a = ", b = " + b); // → a =3、b = 4
※add1は、引数に1を足して返す関数です。

関数が呼び出されたとき、変数aの値が引数xに代入されます。引数にプリミティブ値を渡す場合は、その値そのものが引数に渡されます。これを値渡しといいます。変数aと変数xはメモリの異なる領域にある別々の変数です。このため、xの値を変更してもaの値は変更されません。

引数がオブジェクトの場合

JavaScript
function add1(p) { p.x = p.x + 1; return p; }
ver a = {x:3,y:4};
ver b = add1(a);
console.log(a,b); // → Object {x=4,y=5} Object {x=4,y=5}
add1は、2次元座標の各成分に1を足して、その座標を返す関数です。関数が呼び出されたとき、aの値が引数pに代入されます。これはプリミティブ値の場合と同じです。ですが、先ほどとは違って変数aにはオブジェクト{x:3,y:4}への参照が格納されており、この参照値が引数pに代入されます。つまり、引数にオブジェクトを指定した場合は、参照値が引数に渡されます。これを参照渡しといいます。この場合、引数pと変数aは同じオブジェクトを参照指定ます。このため、関数内でp.xやp.yを変更することは、a.xやa.yを変更することと同じこととなります。

まとめ

関数を利用するメリットとして『再利用できる』『理解しやすいプログラムにできる』『プログラムの修正が容易になる』などの点があげられます。

・再利用できる
同じ処理を何回も行う場合に、その処理をまとめて関数にしておけば、関数を呼び出すだけで同じ処理を何回でも行うことができます。これによって同じコードを何回も書く必要はなくなります。

・理解しやすいプログラムにできる
関数を使えば、一定の処理のまとまりに名前をつけることができます。こうすることで、プログラムを読む際に処理の内容を把握しやすくなります。

・プログラムの修正が容易になる
関数を使用しないと、同じ処理をプログラムのあちこちに記述しなければなりません。この場合、その処理部分を修正するのに、同じ修正を複数回行う必要があります。しかし関数にまとめておけば、その関数だけを修正すればよいので、修正が容易になります。