2012年6月10日日曜日

javascriptとfunction型 その3

function型が第一級型ということは、functionを戻り値にすることもできます。
が、これの使い方は正直言ってややレベル高いです。。。
詳しく知りたい方は、「カリー化」「部分適用」「クロージャ」あたりの単語でgoogle先生に訊いてみると幸せになれるかも。

今回は、ブログのタイトルもタイトルなので、ちょっとメタルを絡めたコードを例を書いてみました。

//誰かを紹介するfunction...を返すfunction
function introduceSomeone(who){
   //ここでの戻り値はfunction
   return function(description){
      //上位の引数であるwhoも参照できるのがポイント
      //詳しくは「クロージャ」っていう単語でググって下さい。。。
      WScript.echo(who + " is " + description + ".");
   }
}


//"Alex"について紹介するfunctionが格納される
var introduceAlex = introduceSomeone("Alex");

//以下、Alexについての紹介
introduceAlex("a guiterist");// => "Alex is a guiterist."
introduceAlex("living in Finland");// => "Alex is living in Finland."
introduceAlex("a member of the heavy metal band called Children Of Bodom"); //=> "Alex is a member of the..."(略)

//こういう風に呼んでも結果は同じ
introduceSomeone("Alex")("the main composer of his band");// => "Alex is the main composer of his band."

以上、Alexのfunctionを返すfunctionの紹介でした。
要は、「複数の引数を取るけど、一回決めた引数は使いまわしたいfunction」に適用すると便利です。
毎回毎回引数を指定するのが面倒・・・というのもありますが、本筋は余計なバグを防止することじゃないでしょうか。
例えば、コピペをミスったりとか、他の処理から間違えて値を更新してしまったりとか。。。
上記の例のintroduceAlexを使っている限り、他の処理が何をやっていてもwhoが"Alex"であることが保障されるのがポイントです。
非同期とか分散処理をやっていても安全に使えるのがいいですね。

0 件のコメント:

コメントを投稿