functionの省略形
JavaScriptで無名関数を使うときは例えば以下のように長くなりがち(ちょっと作為的だけど)。
[1,2,3,4,5].filter(function(x){return x%2}).map(function(x){return x*2})
というわけで、タイプ数を減らせる関数$Lを考える。
最初はfunctionだから$Fにしようと思ったけど、prototype.jsとかぶるのでlambdaから$Lにしてみた。
使い方
$L('引数1,引数2,…:返値')
引数はカンマで区切り、返値はコロンで区切った文字列を与える。
上記の例なら、以下のように書ける。
[1,2,3,4,5].filter($L('x:x%2')).map($L('x:x*2'))
文字列ベースなので凝ったことをしようとするとはまりそうだけど、ちょっとしたことには使えるかな?
関数本体
function $L(str){ var tmp=str.match(/([^:]+):(.*)/); var arg=tmp[1].split(','); arg.push('return '+tmp[2]); return Function.apply(this,arg); }
疑問点
newをつけなくても動いてるけどいいんだろうか?
でも、return (new Function.apply(...とすると以下のエラーになるし…。
TypeError: Function.prototype.apply called on incompatible [object Object]