プログラマメモ2 - programmer no memo2

くろーじゃー じゃばすくりぷと - 手習い 2013/10/02

5、6年前からの悩みは、クロージャーがよくわからないということでした。
なんとなくはわかりますよ。もちろん。でも、体に染みこまないというかなんというか。
 
 今回は、jqueryのイベントハンドラ登録使ってみました。
登録する際に関数を登録しますが、この関数に引数を渡したいなーと思ったわけです。

で、最近,ジョンレシグさんの翻訳本をぱらぱら勉強しているのですが、なんかちょっとわかった気がしたんですよね。

クロージャーを使えば、渡された引数の値を内部で保持できることがわかったので、以下、かなりわかりづらいサンプル。

モダンなjavascripitでは、htmlにインラインでイベント設定しないのがはやりっぽいので、jquery使って、ロード時にイベントハンドラを登録。その際の関数を返す関数を引数つきで実行させて、それがハンドラごとのパラメータ値になるイメージです。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>タイトル</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <script> function initThisPage() { // 関数を返すようにして、返す関数がイベントに反応するようにしたい。 // 渡された引数をクロージャーからみえる var f = function(a, nf){ var len = a; var nf = nf; return function(){ // 桁数が指定された桁より大きいと反応するようにする if(this.value.length >= len){ alert('*** bingo' + nf);} }; }; // id=txtに何か入力したら反応するように設定 $('#txt').keyup(f(3, '#btn')); } </script> </head> <body onload="initThisPage()"> <input id="txt" type="text" size="4" max="6"> <br/> <button id="btn">aaaaa</button> </body> </html>



ninjya本ためになります。

JavaScript Ninjaの極意 ライブラリ開発のための知識とコーディング (Programmers’ SELECTION)
ジョン・レシグ John Resig ベア・ビボー Bear Bibeault 勝亦 勇
4798128457

groovyのクロージャ 練習 2008/09/02

Groovyです。
クロージャです。


Groovyのクロージャの書き方が好きかも。

def localMethod() {
def v = new Date()
return { println v }
}

def clos = localMethod()
Thread.sleep(3000)

println new Date()

// 実行
clos()


結果
Tue Sep 02 22:05:48 JST 2008
Tue Sep 02 22:05:45 JST 2008


次に下記のような書き方ができることに僕は何かしらの可能性をみているのだった。

def c = [
"a1": { println "==>a1"},
"a2": { println "==>a2"},
"a3": { println "==>a3"}
]
c.a1()
c['a2']()
def clos = c['a3']
clos()


結果
==>a1
==>a2
==>a3


ふたつめのこのc['a2']()の書き方がかっこいいと思うのだけど。

あと僕がJSONにたいしてなんとなく可能性をみているのは、キー:値の値にやはりプログラムを載せれそうなところなんだよね。