2012年6月10日日曜日

javascriptとfunction型 その2

functionが第一級型だということは、functionの引数にfunctionを渡すことも出来ます。

例えば,

function sayHello(name,_after) {
 WScript.echo("Hello," + name + "!");

  //_afterに渡されたfunctionを呼ぶ
  //ただ、_afterがあるかどうかもそれがfunctionかも分からないので
  //一応条件分岐
  if(_after && typeof(_after) == "function"){
     _after(name); //ここではnameで渡された値をそのままスルー
  }
}



//単にnameを元にechoするだけのfunction
function sayPleaseWelcome(name) {
 WScript.echo("Please welcome " + name + "!");
}

//こちらは_afterを指定してないので、単にsayHelloを実行
sayHello("Tetsuya"); //=>"Hello,Tetsuya!"

//_afterにsayPleaseWelcomeを指定しているので、
//sayHelloが呼ばれた後にsayPleaseWelcomeが呼ばれる
sayHello("Tetsuya",sayPleaseWelcome); //=> "Hello,Tetsuya!" => "Please welcome Tetsuya!"
のようにcallbackイベントを作るときなんかに使います。

この例ではsayHelloに渡されたnameをそのまま_afterに渡していますが、例えば最初のfunctionでなんらかの処理をした結果を_afterの引数として渡してあげるともっと使い勝手が良いです。
めんどくさいのでコードは書きませんが、ajaxなんかの非同期処理がバンバン出てくるときに使うと便利ですね。

ここでは、上のコードをもうちょっといじって遊んでみます。
例えば、私、Tetsuyaが嫌われている場合のソースコード。
他の人は歓迎しますが、Tetsuyaだけは嫌いなので出て行って欲しいのです。。。
でも、大人としてちゃんと挨拶だけはしてくれます。

//最初の挨拶
function sayHello(name,_after) {
  WScript.echo("Hello," + name + "!");
  if(_after && typeof(_after) == "function"){
      _after(name);
  }
}

//歓迎すべき人への対応
function sayPleaseWelcome(name) {
   WScript.echo("Please welcome " + name + "!");
}
//好ましく無い人への対応
function sayGetOut(name) {
   WScript.echo("Get out of here," + name + "!");
}

//最初の挨拶はするけど、その後の対応は人による
function userComing(name){
   if(name == "Tetsuya"){
      //Tetsuyaだけは出て行って欲しい
      sayHello(name,sayGetOut);
   }else{
      //他の人は歓迎
      sayHello(name,sayPleaseWelcome);
   }
}



//Tetsuyaが来た場合
userComing("Tetsuya");// => 「出て行け」ってゆわれる(涙)

//Taroが来た場合
userComing("Taro");// => 歓迎される(^ o ^) 

0 件のコメント:

コメントを投稿