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
是否在 if
或 while
或 switch
中并不重要,只要函数在尾部位置即可可以优化尾调用。
我时常使用 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
是否在 if
或 while
或 switch
中并不重要,只要函数在尾部位置即可可以优化尾调用。