缩短JavaScript switch语句

3

我有一段代码类似于这样:

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个回答

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() { ... }中。否则,在分配变量时就会调用函数,而不是在触发事件时调用函数。

0
如果函数设置在全局作用域中,你可以使用以下代码:
$(o).test({
    default: true
}).on("click", function (e) {
    stopf(e);
    window["func" + v[0]](v[1], v[2]);
}

很棒的解决方案,但是第五个案例有v[1]和v[2]。 - Wilfredo P
@Barmar,刚看到了。 - A. Wolff
请评论一下为什么要给我点踩,我犯了什么错误吗?我应该删除回答吗?! - A. Wolff
1
我认为你对内部函数的参数列表做出了太多的假设。看到OTs示例中这些参数是多么不稳定,谁知道在“// AND ON AND ON....”中可能会出现什么。用一个越来越庞大的三元运算符来处理这个问题只会是纯粹的地狱。 - Yoshi
1
我看不出这会怎么工作。V[1]可能会一直被定义,这将使其在func3和func4中以v[1]作为参数运行。 - user2667089
显示剩余6条评论

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);}

0

你得将它声明为内联函数:

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接