クロージャ ~ JavaScript によるオブジェクト指向プログラミング

クロージャについては、次のページに少し詳しく書き直しました。よかったら、そちらをご覧ください。JavaScript の基本クロージャ

前回のコードをもう一度見てみましょう。

var person = function (n) {

	var name = n;

	return {
		say_hello: function() {
			alert( name );
		}
	};
};

var p1 = person('Ichiro Suzuki');

p1.say_hello();

これはオブジェクトリテラルで区切ると、次のように考えることができます。

すなわち、ファンクションオブジェクトと、その戻り値となるオブジェクト。 及びその戻り値となるオブジェクトの中で定義された、say_hello という名前の function オブジェクトです。

このように定義すると、内側の関数からその外側の変数にアクセスすることが出来ます。

これはどうしてかというと、JavaScript の関数オブジェクトはそれが生成されたときのコンテキストを保持しているからです。

上記の例で言うと、person('Ichiro Suzuki') として function オブジェクトを呼び出したとき、 return にてオブジェクトを生成します。この時に、say_hello という名前をつけられた function オブジェクトが生成されます。 このとき名無しの function オブジェクト内にいますが、JavaScript では function は変数の有効範囲であるスコープを持っています。従って、say_hello はコンテキストとしてこのスコープも保持することになります。 そのスコープ内に name がありますから、say_hello は変数 name にアクセス可能なのです。

このように、関数とこのコンテキストの組み合わせをクロージャ (closure) といいます。JavaScript の関数は実はクロージャなのです。

前回紹介したコードでプライベートメンバを定義しましたが、それが実装可能なのは JavaScript のクロージャのためなのです。

JavaScript によるオブジェクト指向プログラミング 目次 | >> オブジェクト種別判断

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説