为什么“finally”中的 return 会覆盖“try”?
-
27-09-2019 - |
题
try/catch 块中的 return 语句如何工作?
function example() {
try {
return true;
}
finally {
return false;
}
}
我期望这个函数的输出是 true
, ,但相反它是 false
!
解决方案
最后总是执行。这就是它的,这意味着它的收益获取你的情况下使用。
您会想改变你的代码,所以它更像是这样的:
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
一般来说你永远不希望有一个以上的return语句的功能,这样的事情是为什么。
其他提示
根据 ECMA-262(第 5 版,2009 年 12 月),第96:
生产
TryStatement : try Block Finally
评价如下:
- 令 B 为评估 Block 的结果。
- 令 F 为 Final 评估的结果。
- 如果F.type正常,则返回B。
- 返回F。
并从页。36:
Completion 类型用于解释语句的行为(
break
,continue
,return
和throw
)执行非本地控制转移。Completion 类型的值是以下形式的三元组 (类型、值、目标), , 在哪里 类型 是其中之一normal
,break
,continue
,return
, , 或者throw
, 价值 是任何 ECMAScript 语言值或空,并且 目标 是任何 ECMAScript 标识符或为空。
很明显 return false
将设置完成类型 最后 作为 返回, ,这导致 try ... finally
去做 4.返回F.
当您使用finally
,该方法退出之前该块内的火灾的任何代码。因为你使用的finally
块一回,它调用return false
并覆盖在return true
块以前try
。
(术语可能不完全正确。)
为什么你得到虚假的是你在finally块返回。 finally块应始终执行。所以你return true
变为return false
function example() {
try {
return true;
}
catch {
return false;
}
}
据我所知,finally
块的总是执行,不论是否有内部return
或不try
声明。人机工程学,你在return
语句返回内部finally块的价值。
我与Firefox 3.6.10和Chrome 6.0.472.63都在Ubuntu测试此。这可能是该代码可以表现不同的其他浏览器。
在最后块的重写尝试块返回(形象地说)。
只是想指出的是,如果你从最后返回的东西,然后将它从函数返回。但如果最后没有“回归”这个词 - 这将返回从try块的价值;
function example() {
try {
return true;
}
finally {
console.log('finally')
}
}
console.log(example());
// -> finally
// -> true
所以-finally- return
重写-try- return
的返回。
最后应该始终运行在一个try catch块的末尾,以便(通过规范)就是为什么你越来越假返回。请注意,这是完全可能的,不同的浏览器具有不同的实现。
这个是什么?
doubleReturn();
function doubleReturn() {
let sex = 'boy';
try {
return sex;
console.log('this never gets called...');
} catch (e) {} finally {
sex = 'girl';
alert(sex);
}
}