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 件のコメント:
コメントを投稿