2013-08-23 10 views
16

Nur aus Neugier, ich sehe oft Situationen wie:switch-case mit Rückgabe- und brechen

switch(something) { 
    case 'alice': 
     return something; 
    break; 
} 

Wo die break völlig überflüssig zu sein scheint, gibt es keinen Grund dafür gibt sowieso zu sein?

+0

Diese _probably_ gegen Fehler zu vermeiden gerade ist, die von Kopieren/Einfügen und/oder haphhazardly modifizieren, dass Code in der Zukunft führen würde . Sieht für mich nach einem guten Sicherheitsnetz aus. – jahroy

+2

die Vertiefungen, es kann nur eine stilistische Wahl gegeben werden - mit dem 'break' als Ende eines vorgeschlagen [Block] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/Block). Aber die 'break' ist nicht erreichbarer Code nach einer' return' Anweisung. Also, es wird nichts tun; aber es wird auch nichts weh tun. –

Antwort

17

Die break; Aussage kann es gewesen sein, bevor die return Anweisung eingeführt wurde. Als solche ist es überflüssig geworden und kann entfernt werden.

In der Tat, wenn Sie diesen Code durch jslint ausführen, wird es diesen Fehler zeigen:

Unreachable 'break' after 'return'.

Unabhängig davon, ob diese Ratschläge beherzigen ist bis zu Ihnen; Es könnte während der Entwicklung hilfreich sein, wenn Sie ein paar Dinge ausprobieren, bevor Sie sich auf einen bestimmten Stil festlegen.

Dies ist eine alternative Schreibweise, die einige argumentieren könnte eine bessere Praxis ist:

var retval = null; 
switch (something) { 
    case 'alice': 
     retval = something; 
     break; 
    // ... 
} 
return retval; 
+1

So einige Leute (JSLint) betrachten tatsächlich die Notation ein * Fehler * 1 für den Hinweis –

+0

@RienNeVaPlus Nun, das ist, wie Crockford über diese Dinge fühlt sich offenbar :) –

-3

der Fall tatsächlich sehr notwendig ist

Sie haben einen Fall, dann müssen Sie von diesem Fall brechen oder auch die anderen Fälle werden auch abgeholt.

Verwendung von Fällen wird am häufigsten als schlechte Praxis betrachtet, bleiben Sie so weit wie möglich von ihnen fern.

switch(casein){ 
case 1:{ 
break; 
} 
case 2:{ 
break 
} 
} 
+1

Nun, einmal ‚Rückkehr‘ wird die Funktion stoppt genannt Ausführung – Plato

+0

Könnten Sie erklären, warum Fälle * verwendet, ist meist schlechte Praxis * in Betracht gezogen? Warum auch die '{}' in deinen Fällen? –

+0

@ user2701974 Ich denke, Sie haben die Frage möglicherweise missverstanden. Es fragt nach der Verwendung von 'break' nach einer' return'. Die 'switch..case' ist nur für den Kontext gedacht. Außerdem werden "Switch" -Blöcke nicht allgemein als schlechte Praktiken angesehen. Sie bevorzugen Alternativen nicht so oft. –

4

break sagt Javascript Auswertung Fälle im switch Block zu stoppen. Die Codeausführung wird nach der abschließenden switch Klammer fortgesetzt. Die return-Anweisung im Beispielcode wird in der Tat weitere Vorfälle verhindern, einschließlich anderer case-Anweisungen und alles, was dem switch-Block folgt.

Ich habe eine break Anweisung in jedem Fall aus Gewohnheit. Wenn ich einen Fall ohne break schreibe dann könnte ich kopieren und einfügen Code-Blöcke um in der Zukunft und das Fehlen einer break Anweisung einen Fehler wie so würde:

function whereLivesA(species){ 
    switch(species){ 
    case 'worms': 
     // Relying on return to prevent further code execution within the switch 
     // block works but is ~bad~ smelly (according to plato :D) 
     var habitat = 'dirt' 
     return (species + ' live in ' + habitat); 
    case 'bees': 
     var habitat = 'hive'; 
     break; 
    } 
    // Stuff to do after the switch statement (unless you returned already) 
    var str = species+' live in '+habitat; 
    return str; 
} 
console.log('whereLivesA'); 
console.log(whereLivesA("worms")); 
console.log(whereLivesA("bees")); 
    /* Output: 
    whereLivesA 
    worms live in dirt 
    bees live in hive 
    */ 


function whereLivesB(species){ 
    switch(species){ 
    case "worms": 
     // what if future code changes remove `return` and don't add `break`? 
     // return (species + ' live in ' + habitat) 
     var habitat = 'dirt'; 
     // break; 
    case "bees": 
     var habitat = 'hive' 
     break; 
    } 
    // Stuff to do after the switch statement (unless you returned already) 
    var str = species+' live in '+habitat; 
    return str; 
} 
console.log('whereLivesB'); 
console.log(whereLivesB("bees")); 
console.log(whereLivesB("worms")); 
    /* Output: 
    whereLivesB 
    bees live in hive 
    worms live in hive 
    */ 


function whereLivesCorrect(species){ 
    switch(species){ 
    case "worms": 
     var habitat = 'dirt'; 
     break; 
    case "bees": 
     var habitat = 'hive' 
     break; 
    } 
    // Stuff to do after the switch statement (unless you returned already) 
    var str = species+' live in '+habitat; 
    return str; 
} 

console.log('whereLivesCorrect'); 
console.log(whereLivesCorrect("bees")); 
console.log(whereLivesCorrect("worms")); 
    /* Output: 
    whereLivesCorrect 
    bees live in hive 
    worms live in dirt 
    */ 

JS Neulinge: Wenn Sie nicht tun Möchten Sie es in einer Datei speichern und node filename ausführen, können Sie F12 drücken und dieses Skript oder andere eigenständige Skripts in die Konsole Ihres Browsers einfügen, um es auszuführen. Wenn Sie node.js verwenden, können Sie auch node in eine Befehlszeile eingeben, um eine node Konsole zu starten und sie dort einzufügen.

0

Das break Schlüsselwort wird verwendet, um die Anweisung oder Ausfahrt aus der Schleife zu beenden, damit es läuft nicht fortgesetzt wird.

zum Beispiel:

html

what's your age?: <input type="text" id="ageOf"><br> 
<input type="submit" onSubmit="postReply();"> 
<div id="reply"></div> 

js

var userResponse = document.getElementById('ageOf'); 
var response = document.getElementById('reply'); 

function postReply() { 
    switch(ageOf) { 

    case 1: ageOf<18 { 
     response.innerHTML = "You are still young."; 
     break; 
    } 

    case 2: ageOf>18 && ageOf<45 { 
     response.innerHTML = "You are getting up there..."; 
     break; 
    } 

    case 3: ageOf >= 45 { 
     response.innerHTML = "You are over the hill!"; 
     break; 
    } 
} 

so auf Vorlage sollte die Form der function postReply() rufen, überprüfen Sie die Benutzer Antwort und je nach dem Wert, sollte es gebe eine dieser Aussagen zurück.

+1

Sind diese Bedingungen nach den Case-Labels eigentlich gültige Syntax? "ageOf <18" sieht mir zweifelhaft an. Außerdem betrifft die Frage des OP wirklich nur, warum jemand nach einer Rückkehranweisung eine "Break" -Anweisung verwenden würde. – jahroy

+0

Ich habe vielleicht die Syntax durcheinander gebracht, aber ich habe versucht, ein Beispiel zu geben, damit es klarer ist. – matt6frey

+0

A) Die Fälle sind nicht in geschweiften Klammern eingeschlossen. B) Sie müssen Literale an "case" übergeben. z.B. anstatt 'case 1: ageOf <18 {}' würdest du 'var s = 'young' machen; wenn (Alter> 18) {s = 'mittel'}; if (Alter> 45) {s = alt '} 'und dann' switch (s) {case' young ': ...; Unterbrechung; Fall 'mittel' ...} ' – Plato