無名関数(即時関数)について

無名関数(即時関数)を使うとスコープ範囲を限定できるのでグローバルで変数、関数の衝突を避けることができます。

var a = 'a';

// 無名関数
(function() {
  var a = 'new a';
  var b = 'b';

  console.log(a); // => 'new a'
})();

console.info(a); //=> 'a' 無名関数とはスコープが異なる
console.info(b); //=> エラーになる

1. 活用例

無名関数の活用例を紹介します。

1.1. 無名関数を利用したクラスの定義

無名関数を利用してクラス的なオブジェクトを定義できます。

// 無名関数
(function() {
  function Hoge() {
    console.log("Constructor");
  }
  Hoge.prototype.instanceMethod = function() {
    console.log("Instance Method");
  }
  Hoge.classMethod = function() {
    console.log("Class(Static) Method");
  }
  window.Hoge = Hoge;
})();

var hoge = new Hoge();
hoge.instanceMethod(); // => Instance Method
Hoge.classMethod(); // => Class(Static) Method

1.2. プライベートメソッドの模倣

クロージャを利用してプライベートメソッド、変数を模倣するサンプルです。

var generateCounter = function() {
  var privateCounter = 0;

  function changeBy(val) {
    privateCounter += val;
  }

  return {
    increase: function() {
      changeBy(1);
    },
    decrease: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  };
};

var counter1 = generateCounter();
var counter2 = generateCounter();
console.log(counter1.value()); //=> 0
counter1.increase();
counter1.increase();
console.log(counter1.value()); //=> 2
counter1.decrease();
console.log(counter1.value()); //=> 1
console.log(counter2.value()); //=> 0

2. 参考リンク

results matching ""

    No results matching ""