为什么我的switch-statement中只有两个案例有效?

时间:2018-04-13 07:01:48

标签: javascript switch-statement

当我运行此代码时,它始终会一直持续到“Quadrat”。 “Überraschung”也很完美。 “Kreis”和“Dreieck”没有。我真的不知道为什么会这样。你能明白为什么吗?

case 'Kreis':
    function draw() {
        ellipse(56, 46, 55, 55);}
    break;  

case 'Dreieck':
    function draw() {
        triangle(30, 75, 58, 20, 86, 75);}
    break;

case 'Quadrat':
    function draw() {
        rect(30, 20, 55, 55);}
    break;

case 'Überraschung':
    var rN = Math.floor(Math.random() * 3);
    if (rN === 0) {
        function draw() {
            line(30, 20, 85, 75);}}
    else if (rN === 1) {
        function draw () {
            quad(38, 31, 86, 20, 69, 63, 30, 76);}}
    if (rN === 2) {
        function draw () {
            arc(50, 50, 80, 80, 0, PI + QUARTER_PI);}}
    break;

default:
    alert('Hast du was geschrieben, was ich verstehe?');
    break;}

感谢您的时间!

2 个答案:

答案 0 :(得分:1)

function声明悬挂,函数的条件声明不是一件事:



if (true) {
    function foo() { console.log('foo'); }
} else {
    function foo() { console.log('bar'); }
}

foo();




后者总是有时会覆盖前一个,* if甚至在函数被提升之前都没有被评估过。

*看起来不同的浏览器在此处表现不同。基本上它是未定义的,哪个声明将是规范的。

如果您希望符号draw动态地采用不同的值,则不能使用函数声明,但必须使用值赋值:

var draw;

switch (...) {
    ...
        draw = function () { ... };
}

在这里你可以做一些函数式编程:

draw = ellipse.bind(null, 56, 46, 55, 55);

答案 1 :(得分:0)

您需要将其更改为单个绘图功能,然后在其中切换:

function draw() {
  switch (what) {
    case 'Kreis':
      ellipse(56, 46, 55, 55);
      break;
    case 'Dreieck':
      triangle(30, 75, 58, 20, 86, 75);
      break;
    case 'Quadrat':
      rect(30, 20, 55, 55);
      break;
    case 'Überraschung':
      var rN = Math.floor(Math.random() * 3);
      if (rN === 0) {
        line(30, 20, 85, 75);
      } else if (rN === 1) {
        quad(38, 31, 86, 20, 69, 63, 30, 76);
      }
      if (rN === 2) {
        arc(50, 50, 80, 80, 0, PI + QUARTER_PI);
      }
      break;
    default:
      alert('Hast du was geschrieben, was ich verstehe?');
  }
}