【JS】即時関数

目次

即時関数(IIFE)の定義

関数定義と同時一度だけ実行される関数。
即時実行関数とも呼ばれる。

一般的な記述

let result = (function(仮引数){
  return 戻り値;
})(実引数);

解説

関数宣言を()で囲み、実行するときに渡す引数(実引数)を渡す。
実引数は仮引数に渡り、関数スコープの中で仮引数が使用できる。
戻り値はresult(呼び出し元)に格納される。

即時関数の大きな特徴

  1. 関数定義時に呼ばれる
  2. 呼び出し元に返ってくるのは、関数定義ではなくreturn文に続く戻り値である

実際のコード

function a() {
  console.log('called');
}
a();
// calledが表示される

上記を即時関数へ書き換える。

// function外の()はグループ化をしている
// 一度だけ使用する関数なので、名前を付けずにエラーを回避
(function () {
  console.log('called');
})();

// 関数式の場合は()はいらない
let b = function () {
  console.log('called');
}();

即時関数にreturnが記述されている場合

let c = (function () {
  console.log('called');
  return 0;
})();
console.log(c);
// 0 が表示

引数が定義されている場合

let c = (function (d) {
  console.log('called' + d);
  return 0;
})(10);
console.log(c);
// called 10 が表示

即時関数はどういう場合に使用されるのか

関数スコープを利用し、関数の中でしか使えない変数や関数と、関数の外で使える変数や関数を、明確に区別したいときに使用する。

returnに続くオブジェクトがcに格納されるため、関数の外でも使用できる。

let c = (function () {
  console.log('called');

  let privateVal = 0;
  let publicVal = 10;

  function privateFn() {
    console.log('privateFn is called');
  }
  function publicFn() {
    console.log('publicFn is called');
  }
  return {
    publicVal,
    publicFn,
  };
})();
c.publicFn(); // 外から呼び出せる。publicFn is called が表示される。
console.log(c.publicVal); // 外から呼び出せる。10 が表示される。

c.privateFn(); // 外から呼び出せない。エラーになる。
let c = (function () {
  console.log('called');

  let privateVal = 0;
  let publicVal = 10;

  function privateFn() {
    console.log('privateFn is called');
  }
  function publicFn() {
    console.log('publicFn is called: ' + privateVal++);
    // privateValはレキシカルスコープに定義されていて、即時関数が実行された一度だけ初期化される。
    // それ以降はpublicFnが呼ばれたタイミングでプラスされていく。
  }
  return {
    publicVal,
    publicFn,
  };
})();

c.publicFn(); // 結果、何回も呼び出すとprivateValの値が増えていく。
c.publicFn(); // publicFnを通してしか、privateValの値を変更できなくなる。
c.publicFn();
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次