Wird das Zurückkehren aus einer switch-Anweisung in JavaScript als bessere Vorgehensweise angesehen als die Verwendung von break?


198

Option 1 - Schalter mit Return:

function myFunction(opt) 
{
    switch (opt) 
    {
        case 1: return "One";
        case 2: return "Two";
        case 3: return "Three";

        default: return "";
    }    
}

Option 2 - Schalter mit Pause:

function myFunction(opt) 
{
    var retVal = "";

    switch (opt) 
    {
        case 1: 
            retVal = "One";
            break;

        case 2: 
            retVal = "Two";
            break;

        case 3: 
            retVal = "Three";
            break;
    }

    return retVal;
}

Ich weiß, dass beide funktionieren, aber ist eine weitere bewährte Methode? Ich mag Option 1 - schalte am besten mit Return um, da es sauberer und einfacher ist.


Hier ist eine jsFiddle meines spezifischen Beispiels unter Verwendung der in den Kommentaren von @ ic3b3rg erwähnten Technik :

var SFAIC = {};

SFAIC.common = 
{
    masterPages: 
    {
        cs: "CS_",
        cp: "CP_"
    },

    contentPages: 
    {
        cs: "CSContent_",
        cp: "CPContent_"    
    }
};

function getElementPrefix(page) 
{
    return (page in SFAIC.common.masterPages)
        ? SFAIC.common.masterPages[page]
        : (page in SFAIC.common.contentPages)
            ? SFAIC.common.contentPages[page]
            : undefined;
}

Um die Funktion aufzurufen, würde ich dies auf folgende Arten tun:

getElementPrefix(SFAIC.common.masterPages.cs);
getElementPrefix(SFAIC.common.masterPages.cp);
getElementPrefix(SFAIC.common.contentPages.cs);
getElementPrefix(SFAIC.common.contentPages.cp);

Problem hierbei ist, dass es immer undefiniert zurückgibt. Ich vermute, dass es daran liegt, dass der tatsächliche Wert des Objektliteral und nicht die Eigenschaft übergeben wird. Was würde ich tun, um dies mit der in den Kommentaren von @ ic3b3rg beschriebenen Technik zu beheben ?


4
+1 Gute Frage. Ich habe mich das selbst gefragt, und obwohl ich weiß, dass es funktioniert, einfach zurückzukehren, weiß ich nicht, ob es die beste Vorgehensweise ist. Neugierig zu sehen, was die Community denkt.
Eli

Antworten:


266

Mit einer Pause können Sie die Verarbeitung in der Funktion fortsetzen. Nur aus dem Schalter zurückzukehren ist in Ordnung, wenn das alles ist, was Sie in der Funktion tun möchten.


6
In Anbetracht des Beispiels in meiner Frage lautet die Antwort ja. Wenn Sie jedoch eine Funktion haben, bei der Sie weitermachen müssen, ist eine Pause offensichtlich das, was Sie verwenden würden.
Code Maverick

9
Die Antwort von @Mark Costello hat mich dazu gebracht, mich ein bisschen mehr für Ihre Frage zu bedanken. Ich denke, Sie suchen nach einer allgemeinen "Best Practice" -Richtlinie, aber in dem von Ihnen angegebenen Beispiel ist die Best Practice die beste return {1:"One",2:"Two,3:"Three"}[opt];. Wenn Sie die Standardeinstellung benötigen, ist diesvar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg

@ ic3b3rg - Ich habe meine Frage mit meinem speziellen Beispiel bearbeitet, um Ihre Technik zu verwenden return (opt in o) ? o[opt] : "";, aber in meinem speziellen Fall wird immer die Standardeinstellung zurückgegeben.
Code Maverick

Es war ein Tippfehler in meinem Code (die 2. fehlt "in "Two") , aber es funktioniert für mich ... hier ist ein einfacher Test:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg

Ich habe nicht Ihr Beispiel verwendet, sondern nur die Technik. Schauen Sie sich meine Frage an und klicken Sie auf den Link zu meiner jsFiddle, um zu sehen, wovon ich spreche.
Code Maverick

9

Es kommt darauf an, ob Ihre Funktion nur aus der switch-Anweisung besteht, dann denke ich, dass es in Ordnung ist. Wenn Sie jedoch andere Vorgänge innerhalb dieser Funktion ausführen möchten, ist dies wahrscheinlich keine gute Idee. Möglicherweise müssen Sie Ihre Anforderungen jetzt und in Zukunft berücksichtigen. Wenn Sie Ihre Funktion von Option eins auf Option zwei ändern möchten, ist mehr Refactoring erforderlich.

Angesichts der Tatsache, dass in if / else-Anweisungen Folgendes empfohlen wird:

var foo = "bar";

if(foo == "bar") {
    return 0;
}
else {
    return 100;
}

Auf dieser Grundlage könnte argumentiert werden, dass Option 1 eine bessere Praxis ist.

Kurz gesagt, es gibt keine klare Antwort. Solange Ihr Code einem konsistenten, lesbaren und wartbaren Standard entspricht - das heißt, mischen Sie die Optionen eins und zwei in Ihrer gesamten Anwendung nicht. Dies ist die beste Vorgehensweise, die Sie sein sollten folgenden.


2
Die beste Praxis in diesem Beispiel istreturn foo == "bar";
ic3b3rg

10
Ich entschuldige mich, wenn ich Sie ärgere, aber in diesem Fall würde ich noch vereinfachen: return foo == "bar" ? 0 : 100;oder sogar return [100,0][foo == "bar"];.
ic3b3rg

4
@ ic3b3rg - Sollte das nicht sein : return [100,0][+(foo == "bar")]; ?
Warteschlange

3
@ Queue Sie haben Recht, dass der Boolesche Wert in eine Ganzzahl konvertiert werden sollte, aber ich würde es so machen:return [100,0][foo == "bar" & 1];
ic3b3rg

7
@ ic3b3rg && Queue - Wie möchten Sie jemand anderen Code mit solchen Tricks pflegen? (Vertrauen Sie dem Precompiler, um
solche Dinge zu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.