Martin FowlerのClosure紹介用JavaScriptサンプル
Martin Fowlerのブログ (の日本語訳) にClosureの入門的な記事があります。作成は古いようですが、Closureについて知らない人に取っては良い記事かと思いました。
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure
あいにく例えがRubyで、他のサンプルもC#やPythonだったので、一番身近なJavaScriptでサンプルプログラムを書き直してみました。
あいにく、Enumerable#selectは持ち合わせていないので、Arrayにメソッドを足しました。これもJavaScriptならではだから、却ってわかりづらいかなって気もしますが。
function Employee() // object def
{
// actually not necessary
var salary;
var isManager;
}
/**
* returns copy
* @see prototype.js Enumerable#findAll
* @see http://www.imgsrc.co.jp/~kuriyama/prototype/prototype.js.html#Reference.Enumerable
*/
Array.prototype.select = function(func)
{
var ary = [];
for (var i = 0; i < this.length; ++i)
{
if (func(this[i]))
ary[ary.length] = this[i];
}
return ary;
};
function managers(emps)
{
return emps.select(function (e){ return e.isManager; });
}
function highPaid(emps)
{
var threshold = 150;
return emps.select(function (e){ return e.salary > threshold; });
}
function paidMore(amount)
{
return function(e){ return e.salary > amount; };
}
var highPaid = paidMore(150);
var john = new Employee();
john.salary = 200;
document.write(highPaid(john));
var jane = new Employee();
jane.isManager = true;
document.write(managers([john, jane]).length);

まじわからん・・・
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3
やばい、、、最近のプログラミング技術についていけん・・・
C++で例えてください。
はやったのは最近ですが
SchemeやSmallTalkとかの関数系言語で実装されたのはだいぶ前のようですよ。
C++にはClosureないのですが、リンク先のリンク先にCでClosure(閉包)を実装しているのがあったので、これを読むとよくわかるかと思います。
http://www-06.ibm.com/jp/developerworks/linux/050428/j_l-highfunc2.html
C++0x 無名関数
http://printf.jugem.jp/?eid=473
こういうのとは違うのかなぁ・・・
とりあえず使いもしない言語に深入りするのはやめておこう。
たぶんそういうものです
ちゃんと読んでいませんが。
C++にも入るなら、「使いもしない」ことにはならなそうですね。
コメント欄にもあるけど、呼び出し元の環境(変数)にアクセスできるのがClosureの特徴ですが、C++はメモリー管理が自動ではないので、積極的に使うのはちょっと怖いですね。
C++の次は2009年なんだけど・・・
C++に入っても、使われ始めるのはずいぶん先になりそうだなぁ・・
C言語の最新版も1999年に出てるけど、使われてる様子ないし(笑)