Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

キーワード引数風な関数 その1

pythonなどで使われているキーワード引数はかなり便利なので似たようなものができないか実験してみる。
個人的には結構前から思っていて、

  • そもそもcall、applyは多用したいけど引き数の順番を意識しなあかん

というのが発端です。
関数をグルーピングして一括実行する際に引き数を渡したいとかいったときにやだなあと。
jsonを渡して関数の引き数と一致したものにマッピングされればこれは解決できるんじゃなかろうか。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Dict Sample</title>

<script type="text/javascript">
Function.prototype.dict = function(){
  var x = this;
  var funcstr = x.toString();
  var ret = funcstr.match(/\([0-9A-Za-z_, ]+\)/).toString();
  ret = ret.substring(1,ret.length-1); 
  var arr = ret.split(',');
  
  var func = function(dict){
    var args = [];
    for(var i = 0; i < arr.length; i++){
      var key = arr[i];
      key = key.replace(/^[  ]+/,"");
      key = key.replace(/[  ]+$/,"");
      if(key in dict){
        args[i] = dict[key];
      }
    }
    return x.apply(func, args);
  }
  return func;
}

var dict = {
  text3 : "hoge3",
  text2 : "hoge2",
  text : "hoge2",
  text1 : "hoge1"
}

function test(text1, text2){
  alert(text1);
  alert(text2);
}
var dict_func = test.dict();
dict_func(dict);

</script>

</head>
<body>
</body>
</html>

細かいスコープとかは適当です。
とりあえず

function test(text1, text2){
  alert(text1);
  alert(text2);
}

を見ると引き数のkeyが

  • text1
  • text2

なので

var dict = {
  text3 : "hoge3",
  text2 : "hoge2",
  text : "hoge2",
  text1 : "hoge1"
}

のtext1とtext2のみが出力されます。
他の値は無視されます。
なので関数自身が引き数を取捨選択し実行できるようになります。
必要なものをガンガンJSONにぶち込んでグルーピングした関数で一括実行なんかができるようになります。
インターフェイスを合わせなくてもOKになる)
もちろんこれは引き数をちゃんと定義している関数のみで有効ですね。
うくく。