Javascript 带返回和断开的开关箱

Javascript 带返回和断开的开关箱,javascript,design-patterns,Javascript,Design Patterns,出于好奇,我经常看到这样的情况: switch(something) { case 'alice': return something; break; } 如果中断似乎是完全不必要的,那么它有什么理由存在吗?这种情况实际上是非常必要的 如果你有一个案子,那么你需要从这个案子中解脱出来,否则其他案子也会被提起 用例通常被认为是不好的实践,尽可能远离它们 switch(casein){ case 1:{ break; } case 2:{ break } } br

出于好奇,我经常看到这样的情况:

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

如果
中断
似乎是完全不必要的,那么它有什么理由存在吗?

这种情况实际上是非常必要的

如果你有一个案子,那么你需要从这个案子中解脱出来,否则其他案子也会被提起

用例通常被认为是不好的实践,尽可能远离它们

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

break
告诉javascript停止对
开关
块中的案例进行评估。代码执行继续通过关闭开关括号。示例代码中的
return
语句确实会阻止任何超出它的内容,包括其他
case
语句和
开关
块之后的任何内容

我习惯性地在每种情况下都写上一句“break”。如果我写的案例没有
break
,那么我将来可能会复制并粘贴代码块,缺少
break
语句会变成这样的错误:

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新手:如果您不想将其保存到文件并运行
节点文件名
,您可以按F12并将此脚本或其他自包含脚本粘贴到浏览器控制台中运行它


如果使用node.js,还可以在命令行中键入
node
,启动
节点
控制台并将其粘贴到那里。

使用
break
关键字结束语句,或退出循环,使其不再继续运行

例如:

html

你的年龄是多少?:
js

函数postReply(){
设ageOf=document.getElementById('ageOf');
让response=document.getElementById('reply');
开关(真){
年龄为18岁和年龄为45岁的情况:
response.innerHTML=“你有智慧。”;
打破
违约:
response.innerHTML=“”;
打破
}
}

因此在提交时,表单应该调用
函数postReply()
,检查用户答案,并根据值返回其中一条语句。

语句可能在引入
return
语句之前就已存在。因此,它变得多余,可以删除

事实上,当您运行该代码时,它将显示以下错误:

“return”之后不可到达的“break”

是否听从这个建议取决于你;在开发过程中,如果您在确定某个特定样式之前尝试了一些东西,这可能会很有帮助

这是另一种写作风格,有些人可能会认为这是一种更好的做法:

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

那么,一旦调用了“return”,函数就会停止执行。您能解释一下为什么用例通常被认为是不好的做法吗?还有,为什么你的箱子里有
{}
?@user2701974我想你可能误解了这个问题。它询问
返回后如何使用
中断
开关..case
仅用于上下文。而且,
开关
块并不是普遍认为的坏习惯;我认为,只要它们不能被重构和/或应用OOP概念所取代,它们就没有问题。不,我是说,它们被认为是不好的做法,因为人们倾向于在更复杂、更整洁的代码上使用它们。总的来说,功能是相同的,但这更适合顺序编程。我之所以使用{},是因为我在澄清案例的开始和结束位置,它们是不需要的。这可能只是为了防止将来复制/粘贴和/或随意修改代码时出现错误。在我看来,这是一个很好的安全网。考虑到这些凹痕,这可能只是一个风格上的选择——使用
break
作为建议的结尾。但是,
break
return
语句之后是不可访问的代码。所以,它不会做任何事情;但是这也不会有什么坏处。在大小写标签后面的那些条件真的是有效语法吗
ageOf<18
在我看来很可疑。此外,OP的问题实际上只是关于为什么有人会在
return
语句之后使用
break
语句。a)大小写不包含在花括号中B)必须将文本传递给
case
。e、 g.代替
案例1:18岁{s='medium'};如果(年龄>45){s=旧} ,然后<代码>开关(S){“Young”:…;断开;Case' Meal'…}/Cuth>,所以一些人(JSLLT)实际上认为符号是错误的+1。hint@RienNeVaPlus这就是克罗克福德对这些事情的感受:)
function postReply() {
  let ageOf = document.getElementById('ageOf');
  let response = document.getElementById('reply');

  switch(true) {

    case ageOf<18:
      response.innerHTML = "Keep practicing young padewan.";
      break;

    case ageOf>18 && ageOf<45: 
      response.innerHTML = "Much too learn, you have.";
      break;

    case ageOf >= 45:
      response.innerHTML = "You have sage wisdom.";
      break;

    default:
      response.innerHTML = "";
      break;
  }
}
var retval = null;
switch (something) {
    case 'alice':
        retval = something;
        break;
    // ...
}
return retval;