为什么“终于”中的返回会覆盖“尝试”?
2022-08-30 04:29:42
try/catch 块中的 return 语句如何工作?
function example() {
try {
return true;
}
finally {
return false;
}
}
我期望这个函数的输出是,但相反它是!true
false
try/catch 块中的 return 语句如何工作?
function example() {
try {
return true;
}
finally {
return false;
}
}
我期望这个函数的输出是,但相反它是!true
false
最后始终执行。这就是它的用途,这意味着它的返回值会在你的情况下使用。
您需要更改代码,使其更像这样:
function example() {
var returnState = false; // initialization value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
一般来说,你永远不希望在一个函数中有多个 return 语句,像这样的东西就是原因。
根据ECMA-262(5ed,2009年12月),第96页:
生产评估如下:
TryStatement : try Block Finally
- 设 B 是计算 Block 的结果。
- 设 F 为最终评估的结果。
- 如果 F.type 为正常,则返回 B。
- 返回 F。
从第36页开始:
完成类型用于解释执行非局部控制权转移的语句 (、 和 ) 的行为。完成类型的值是形式(类型、值、目标)的三元组,其中类型是 、、、或 之一,值是任何 ECMAScript 语言值或空值,目标为任何 ECMAScript 标识符或空。
break
continue
return
throw
normal
break
continue
return
throw
很明显,会将完成类型设置为 final 作为返回,这会导致执行 4。返回 F。return false
try ... finally