switch语句是尾递归的吗?

Are switch statements tail recursive?

我时常使用 switch 语句。我经常发现自己想在我的函数中使用 return 语句。我想知道这样写的 switch 语句是否仍然是尾调用优化的。

function misc(x) {
    switch(true){
        case x > 1:
            return misc(x-1);
            break;
        default:
            return;
    }
}

需要更改什么才能使 case x > 1 尾调用优化。是否可以使用 switch 语句,或者我是否必须使用其他类似 if 语句的东西?

注意:我知道大多数主流浏览器 JavaScript 不支持尾调用优化。我主要只是想知道上面的代码是否与尾调用优化兼容,无论当前浏览器是否支持它。

ES6 中对尾部调用优化的要求仅取决于函数调用是否处于尾部位置——也就是说,函数是否是返回前执行的最后一件事。

你的情况:

return misc(x-1);

misc()放在尾部位置。因此它可以被尾调用优化。

不可能发生这种情况的情况是,如果您要执行以下操作:

return 1 + misc(x-1);

那是因为它将等同于:

var tmp = misc(x-1);
tmp = 1 + tmp;
return tmp;

这意味着misc()不会在尾部位置。

所以 return 是否在 ifwhileswitch 中并不重要,只要函数在尾部位置即可可以优化尾调用。