[JavaScript General] immediate function pattern(即時関数)

用語の整理。

即時関数の書式

即時関数の書式は、(関数宣言)();

  • 関数定義を読み込んだタイミングで即実行する。
  • 関数をスコープの枠組みとして使う。
// 普通に関数宣言と実行を書くと
function f(args) {
  :
}
f(args);
// 関数宣言を囲って匿名関数にし呼び出し
(function (args) {
  :
})(args);
  • 即時関数とは、「関数定義」「関数呼び出し」の2つをまとめて行なうことができるもの。
  • 即時関数がグローバル変数の使用を抑えることができる。
  • 即時関数を使えば内部で宣言した変数や関数はローカルに限定される。
    (関数宣言)(); について
  • 関数を式として評価させることで( )をケツにひっつけて呼び出せるようにする。
  • functionが行の先頭にあるなら関数宣言となり、それ以外なら関数は式であると言える。
  • 式として評価させる理由は「関数宣言のままだと関数呼び出し演算子の( )を使うことができないから」で、関数を式として評価させる方法は「functionキーワードを行の先頭におかない」こと。

ユースケース

  • ページの初期化
  • 機能判定
  • プライベートプロパティ/メソッドの定義
'use strict';
var counter = (function() {
  var count = 0;
  return {
    increment: function() {
      return count += 1;
    },
    decrement: function() {
      return count -= 1;
    }
  }
})();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.decrement()); // 1
console.log(counter.count);       // undefined

ES2015(ES6)の即時関数

let a = 'foo';
let b = 'bar';
{
  let a = 1;
  let b = 2;
  function add(a, b) {
    return console.log(a + b); // 3
  }
  add(a, b);
}
console.log(a + b); // foobar

即時関数 と jQuery.ready イベント関数は別物

JavaScriptの記述でとてもよく似ていて間違いや誤解をされやすいのが、 即時関数 と jQueryの readyイベント関数 です。

即時関数

  • 「即時に実行、処理される関数」。これは JavaScript の実装 で jQuery とは無関係。
(function(仮引数, ...) {
})(引数)

ready イベント関数

  • jQuery に実装されているイベント処理関数。HTMLドキュメントが全てロードされ、DOMにアクセスができる準備が完了した後に処理される。すなわち「全てのロードが完了した後に実行」される。
$(document).ready(function() {
})