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);

Trackback URL for this post:

http://nonn-et-twk.net/twk/trackback/50
0

まじわからん・・・

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年に出てるけど、使われてる様子ないし(笑)