在任何情况下都运行代码的Javascript开关案例?

时间:2017-06-23 19:33:14

标签: javascript

我有一个标准开关盒块:

switch(variable) {
    case "option1":
        alert("Option 1");
        break;
    case "option2":
        alert("Option 2");
        break;
}

我想运行此代码:

alert("Any Option");

当案例的 匹配时,是否有一种简单的方法可以运行此代码,而无需在每种情况下添加代码, 不带< / em> rechecking&#34;变量&#34; (即切换后不使用if语句?)

5 个答案:

答案 0 :(得分:3)

有很多真正 hacky方法可以做你想要的事情(命名为带有break / continue的do循环,带有switch语句的递归函数等)但是最干净的方法是使用功能,如:

var variable = "option1";

function checkValue (val) {
    switch (variable) {
        case "option1":
            alert("Option 1");
            return true;
        case "option2":
            alert("Option 2");
            return true;
        default: 
            return false;
    }
}

if (checkValue(variable)) {
    // run common code
    alert("Any option");
}

答案 1 :(得分:2)

不直接使用switch语句。请参阅The Switch Statement,ECMAScript 2016标准。

特别是:

语言规范不包含您要查找的功能。

答案 2 :(得分:1)

标记的块可以让您随时突破它。如果你突破default的情况,你可以根据switch语句在let variable = prompt("option1 or option2?"); select: { switch(variable) { case "option1": alert("Option 1"); break; case "option2": alert("Option 2"); break; default: break select; } alert("Both Options"); }语句之后运行一些代码,而不是根据要求重新匹配变量:

&#13;
&#13;
{{1}}
&#13;
&#13;
&#13;

但是,我不推荐这个!标签使代码执行路径不太清晰。上面的代码是不可读的。重新检查变量是一种更好的方法。

答案 3 :(得分:1)

我认为我不会使用你描述的模式,但是这样的东西可以满足你的需求。

/**
 * Use this method to simulate a "finally" statement in a
 * method that resembles a switch
 *
 * @param {*} value - The value to compare
 * @param {Array<*, boolean, function>} options - The collection of switch statements
 *   First value is the value to compare against the original value
 *   Second value specifies if this statement should behave like a break at its end
 *   Third value is the action to take when the value matches
 * @param {function} finallyFn - The method which is run if any statement was executed
 */
function switchWithFinally(value, options, finallyFn) {
    var matched = false,
        breakSwitch = true;
    for(var i = 0; i < options.length; i++) {
        if(!breakSwitch || value === options[i][0]) {
            options[i][2]();
            matched = true;
            breakSwitch = options[i][1];
        }
    }
    if(matched) finallyFn();
}

/**
 * Example call, should return
 *   Option 2
 *   Option 3
 *   Any option
 */
switchWithFinally(
    'option2',
    [
        ['option1', true, function() {
            console.log('Option 1');
        }],
        ['option2', false, function() {
            console.log('Option 2');
        }],
        ['option3', true, function() {
            console.log('Option 3');
        }]
    ],
    function() {
        console.log('Any option');
    }
);

答案 4 :(得分:0)

为什么不在两种情况下调用函数?

switch(variable) {
case "option1":
    dualAlert("Option 1");
    break;
case "option2":
    dualAlert("Option 2");
    break;
}

function dualAlert(text){
    alert(text);
    alert('Common Alert');
}