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]