缩短javascript开关

时间:2014-03-20 12:04:53

标签: javascript jquery

我有一段这样的代码:

switch(v[0]){
    case 1:
        $(o).test({default:true}).on("click", function(e){
            stopf(e);
            func1(v[1]);}           
        });
        break;
    case 2:
        $(o).test({default:true}).on("click",function(e){
            stopf(e);
            func2(v[1]);}           
        });
        break;
    case 3:
        $(o).test({default:true}).on("click",function(e){
            stopf(e);
            func3();}       
        });
        break;
    case 4:
        $(o).test({default:true}).on("click",function(e){
            stopf(e);
            func4();}       
        });
        break;
    case 5:
        $(o).test({default:true}).on("click",function(e){
            stopf(e);
            func5(v[1],v[2]);}          
        });
        break;

    // AND ON AND ON....
}

正如您所看到的,唯一的区别是每行末尾的funcX()部分。有没有办法缩短这段代码?也许这样的事情(尝试过,不起作用):

switch(v[0]){
    case 1: myfunc=func1(v[1]);break;
    case 2: myfunc=func2(v[1]);break;
    case 3: myfunc=func3();break;
    case 4: myfunc=func4();break;
    case 5: myfunc=func5(v[1],v[2]);break;
}
$(o).test({default:true}).on("click",function(e){
    stopf(e);
    myfunc);
}

4 个答案:

答案 0 :(得分:3)

将函数放在对象中:

var funcs = {
    1: function() { func1(v[1]); },
    2: function() { func2(v[1]); },
    3: func3,
    4: func4,
    5: function() { funct5(v[1], v[2]); }
};

然后在绑定点击处理程序时使用它:

$(o).test({default: true}).on("click", function(e) {
    stopf(e);
    funcs[v[0]]();
});

请注意,您必须使用function() { ... }打包所有电话。否则,您将在分配变量时调用该函数,而不是在触发事件时调用该函数。

答案 1 :(得分:0)

如果在全局范围内设置了函数,则可以使用:

$(o).test({
    default: true
}).on("click", function (e) {
    stopf(e);
    window["func" + v[0]](v[1], v[2]);
}

答案 2 :(得分:0)

如果这些参数很重要,这应该使A. Wolff的工作更加正确:

$(o).test({default:true}).on("click",function(e){stopf(e);
    window["func" + v[0]](v[0] == (1 && 2 && 5) ? v[1] : null, v[0] == 5 ? v[2] : null);}

答案 3 :(得分:0)

Eighter你必须将它声明为内联函数:

switch(v[0]){
    case 1: myfunc=function(v[1]){ /* do something 1 */ }; break;
    case 2: myfunc=function(v[1]){ /* do something 2 */ }; break;
    case 3: myfunc=function(){ /* do something 3 */ }; break;
    case 4: myfunc=function(){ /* do something 4 */ }; break;
    case 5: myfunc=function(v[1],v[2]){ /* do something 5 */ }; break;
}

或者你先声明它们(看起来你已经有了这些功能),在我看来这更具可读性:

var func1 = function(p){ /* do something 1 */ };
var func2 = function(p,q){ /* do something 2 */ };

// and use the switch statement like this:

switch(v[0]){
  case 1: myfunc=func1; break;
  case 2: myfunc=func2; break;
}