ECMAScriptクロージャ

ECMAScriptが最も誤解しやすい点は、クロージャ(closure)をサポートしていることです。

クロージャとは、計算されない変数を含むリテラル表現を指し、関数は関数の外で定義された変数を使用できることを意味します。

シンプルなクロージャの例

ECMAScript でグローバル変数を使用することはシンプルなクロージャの例です。以下のコードを考えてみてください:

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

このコードでは、sayHelloWorld() 関数に変数 sMessage の値が計算されずにメモリに読み込まれます。この関数は、sMessage の値を以降の使用のためにキャプチャするだけであり、これは、呼び出し時点で sMessage の値を確認する必要があることを実行子が知っていることを意味します。sMessage は sayHelloWorld() 関数が呼び出される際(最後の行)に値が割り当てられ、メッセージ「hello world」を表示します。

複雑なクロージャの例

関数の中で別の関数を定義することでクロージャがより複雑になります。例えば:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

ここでは、addNum() 関数が doAdd() 関数(クロージャ)を含んでいます。内部関数はクロージャであり、外部関数のパラメータ iNum1、iNum2 とグローバル変数 iBaseNum の値を取得します。addNum() の最終ステップでは、doAdd() を呼び出し、2つのパラメータとグローバル変数を加算し、その和を返します。

重要な概念として、doAdd() 関数はパラメータを受け取らず、その値は実行環境から取得されることを理解する必要があります。

クロージャは ECMAScript で非常に強力で多様な一部であり、複雑な計算を実行するために使用できます。

ヒント:高級関数と同様に、クロージャを使用する際には注意が必要です。なぜなら、それらは非常に複雑になる可能性があるからです。