« | »

01月06日 

javascript

javascriptで関数の引数を不定にしてみる

あけましておめでとうございます。
本年もよろしくお願いいたします。

新年一発目のエントリは技術ネタ、というかTipsというか、あんまり使いどころがよく分からんというか。。。

javascriptは関数の引数に変数を与えなくても

JAVASCRIPT:
  1. function hoge() {
  2.      var arg1 = arguments[0];
  3.      var arg2 = arguments[1];
  4.  
  5.     return arg1+arg2;
  6. }
  7.  
  8. var sum = hoge(1, 2);

なんて感じで引数を取ることが出来ちゃうんですけれども、これだと引数の順番が固定になっちゃったりで、いまいちフレキシブルではないので、もうちょっと柔軟に出来んもんか、と考えたのがオブジェクトを渡す方法。

JAVASCRIPT:
  1. function hoge(args) {
  2.     var arg1 = args["arg1"];
  3.     var arg2 = args["arg2"];
  4.  
  5.     return arg1 + arg2;
  6. }
  7.  
  8. var sum = hoge({"arg1":1, "arg2":2});

キーと変数渡してやればどうでしょ?ということで。

で、何の役に立つねん?というとこなんですが、実行したい関数を変数で与えて、その引数が関数毎に微妙に違うけど、処理は共通、みたいな。ややこしや。

JAVASCRIPT:
  1. var funcs = {
  2.     //var getMemberPhoto = function(args) { <- 文法ミス
  3.     getMemberPhoto : function(args) {
  4.         var params = {
  5.             member_id:args["member_id"]
  6.         };
  7.         ...
  8.     },
  9.     //var getCategoryPhoto = function(args) { <- 文法ミス
  10.     getCategoryPhoto : function(args) {
  11.         var params = {
  12.             category_id:args["category_id"]
  13.         };
  14.         ...
  15.     },
  16.     //var getPhotoByPeriod = function(args) { <- 文法ミス
  17.     getPhotoByPeriod : function(args) {
  18.         var params = {
  19.             start_date:args["start_date"],
  20.             end_date:args["end_date"]
  21.         };
  22.         ....
  23.     }
  24. };
  25.  
  26. function getPhotos() {
  27.     var func = $("input[name=select_func]:checked").val();
  28.     var params = {};
  29.     $("#" + func + " .params").each(function() {
  30.         params[$(this).attr("name")] = $(this).val();
  31.     });
  32.  
  33.     if (typeof funcs[func] == "function") {
  34.         funcs[func](params);
  35.     }
  36. }

(追記)JSの文法ミスってました(汗)

HTML:
  1. <label><input type="radio" name="select_func" value="getMemberPhoto" />指定メンバーの画像取得
  2. <label><input type="radio" name="select_func" value="getCategoryPhoto" />指定カテゴリの画像取得</label>
  3. <label><input type="radio" name="select_func" value="getPhotoByPeriod" />期間を指定して画像を取得</label>
  4.  
  5. <div id="getMemberPhoto">
  6.     <select class="params" name="member_id">
  7.         <option value="1">だれそれ</option>
  8.         ...
  9.     </select>
  10. </div>
  11.  
  12. <div id="getCategoryPhoto">
  13. ...
  14. </div>
  15.  
  16. <div id="getPhotoByPeriod">
  17. ...
  18. </div>
  19.  
  20. <input type="button" value="画像取得" onclick="getPhotos" />

と、こんな感じで使えるよね?ということで(引数、微妙にも違ってないし)。
要jQueryなコードで、且つ実際に組んだコードではないので(爆)←古い、動かない可能性大ですが何かの参考にでもなれば。

ってならんな、こんなん。どこで使うねん。

トラックバック URL

コメント & トラックバック

> 以下のコードって文法ミスのような気がするけど…

var funcs = {
var getMemberPhoto = function(args) {}
}

funcs = {
getMemberPhoto : function(){ }
};

> キーと変数渡してやればどうでしょ?ということで。
> で、何の役に立つねん?というとこなんですが、

// 引数の数多くて、かつ、どれかを省略したいときに便利
function hoge(a, b, c, d, e, f, g){ };

// 下のように使うときが多い。
// ポイントは、関数に渡すパラメータが多いとき、
// 引数が省略されたときのデフォルト値を次のように定義しておいて、
// for inループで、渡された変数を初期化してあげる。
function hoge(param)
{
var a = 0, b = 0, c = 0;

for(var i in param)
{
switch(i)
{
case ‘a’: a = param[i]; break;
case ‘b’: b = param[i]; break;
};
};
};

> 翔護さん
あぁぁぁぁぁぁぁ、お恥ずかしいぃぃぃヽ(´Д`ヽ)(/´Д`)/
速攻、修正しましたw

for inで回すのもナルホドねぇ。これはこれで使いでがありそう。
また後日、改良版(改悪?)でネタにさせて頂きますm(_ _)m

(・∀・)ニヤリ

コメントフィード

コメント