javascript - 为什么我的 switch 语句中只有两种情况有效?

标签 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;}

感谢您的宝贵时间!

最佳答案

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);

关于javascript - 为什么我的 switch 语句中只有两种情况有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49811106/

相关文章:

javascript - 为什么我应该将此 http 调用移至外部服务

javascript - 使用滑动手势从一个页面移动到另一页面

javascript - Google map 是否限制网络浏览器客户端的访问?

c - 在为所有枚举值定义大小写后,编译器仍然说 : "control reaches end of non-void function"

java - 我在完善 switch 语句时遇到问题

java - 在一个switch语句中,为什么所有的case都被执行了?

java - 如何在java中的case语句中输入Double值

javascript - 如何创建一个 mailTo 链接,其正文包含包含转义值的链接

javascript - 通过在相乘成员之间插入 * 使数学方程字符串有效

c - c 中 while 或 do/while 循环内的 switch 语句