JavaScript_関数

関数

関数宣言

JavaScriptの関数は「function」宣言により定義されます。

引数および戻り値に型は指定できませんので、扱いに注意が必要です。


function add(a, b) {
  return a + b;
}

関数式

関数を変数に代入する。

JavaScriptの関数はファーストクラスのオブジェクトなので、変数に代入することができます。


function add(a, b) {
  return a + b;
}
var calc = add;
var sum = calc(1,2);

無名関数

定義した関数を変数に代入しつつ、関数名を省略する記述になります。


var calc = function (a, b) {
  return a + b;
}
var sum = calc(1,2);

アロー関数

ECMAScript2015からは無名関数をさらに省略宣言できるアロー関数式がサポートされるようになりました。

アロー関数では、関数の先頭にfunctionと書く代わりに、引数宣言の後ろに「=>」を記述します。


var calc = (a, b) => {
  return a + b;
}
var sum = calc(1,2);

関数型の引数と戻り値

関数を引数に指定する。

関数は変数に代入できるだけでなく、引数に指定することもできます。


// 引数に指定された関数を実行する関数
function callFunction(funcName) {
    return funcName();
}

// 呼ばれる関数
function funcA() {
    return "funcA!";
}

var str = callFunction(funcA);
console.log(str); // "funcA!"

戻り値に関数を指定する。

関数は戻り値としても指定することもできます。

戻り値の関数を実行するには「functionName()();」と指定します。


// 呼ばれる関数
function funcA() {
    return "funcA!";
}

// 戻り値に関数を返す関数
function callerFunction() {
    return funcA;
}

var str = callerFunction()();
console.log(str); // "funcA!"

即時関数

関数定義と関数呼び出しをセットにすることで、即時実行される関数が定義できます。

記述の変遷は以下の通りです。


1.通常の関数定義と実行の仕方


// 関数定義
function immediateExec(){
  console.log('Immediate execution!');
}
// 関数実行
immediateExec();

2.関数定義と呼び出しをセットにする。

定義と同時に実行されます。


(function immediateExec(){
  console.log('Immediate execution!');
})();

3.無名関数にする。

結局、上記は一度しか利用できない関数なので無名関数にします。


(function (){
  console.log('Immediate execution!');
})();

4.アロー関数にする。

アロー関数化すれば、ワンライナーとなります。


(() => {console.log('Immediate execution!');})();

変遷がわからなければ理解しにくいコードだといえます。

このように関数を定義した目的は以下の2つに集約されます。

  • 一度だけ実行される関数を整理してコードのメンテナンス性を向上する。
  • 関数のスコープを局所化して、グローバルオブジェクトの汚染を防ぐ。

内部関数(クロージャ)

内部関数の定義

JavaScriptでは、関数内に関数を定義できます。

関数のスコープを局所化する場合に利用できます。


function outsideFunc() {
  function insideFunc(num) {
    return num * 3;
  }
  return insideFunc(2);
}

var sum = outsideFunc();

変数の共有

内部関数から外側関数の変数を利用することができます。

クロージャ定義における「自分を囲むスコープにある変数を参照できる関数」に該当します。


function outsideFunc() {
  num = 2;
  function insideFunc() {
    return num * 3;
  }
  return insideFunc();
}

var sum = outsideFunc();

備考となりますが、JavaScriptにおいて即時関数としてワンライナー化するのは、このようなケースです。


function outsideFunc(num) {
  return (() => {return num * 3;})();
}

var sum = outsideFunc(2);

関連ページ