Javascript 为什么“finally”中的返回会覆盖“try”?
try/catch块中的return语句是如何工作的Javascript 为什么“finally”中的返回会覆盖“try”?,javascript,return,try-catch,try-catch-finally,try-finally,Javascript,Return,Try Catch,Try Catch Finally,Try Finally,try/catch块中的return语句是如何工作的 function example() { try { return true; } finally { return false; } } 我希望这个函数的输出是true,但是它是false 当您最后使用时,该块中的任何代码都会在方法退出之前触发。因为您在finally块中使用了一个返回,所以它调用return false并覆盖try块中先前的return true (术语可能
function example() {
try {
return true;
}
finally {
return false;
}
}
我希望这个函数的输出是
true
,但是它是false
当您最后使用时,该块中的任何代码都会在方法退出之前触发。因为您在finally
块中使用了一个返回,所以它调用return false
并覆盖try
块中先前的return true
(术语可能不太正确。)据我所知,最后
块总是执行,无论try
中是否有return
语句。因此,您将获得finally块中的return
语句返回的值
我在Ubuntu中用Firefox 3.6.10和Chrome 6.0.472.63进行了测试。这段代码在其他浏览器中的行为可能有所不同 为什么会变为false是因为您在finally块中返回。最后,块应该始终执行。因此,您的返回true
更改为返回false
function example() {
try {
return true;
}
catch {
return false;
}
}
Finally应该总是在try-catch块的末尾运行,因此(根据规范)就是返回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(2009年12月第5版),第96页:
productionTryStatement:try Block Finally
的评估如下:
设B为计算块的结果
设F为最终计算的结果
如果F.type为normal,则返回B
返回F
第36页:
完成类型用于解释执行非本地控制传输的语句(break
、continue
、return
和throw
)的行为。完成类型的值是形式的三元组(类型、值、目标),其中类型是正常
、中断
、继续
、返回
、或抛出
,值是任何ECMAScript语言值或空,目标是任何ECMAScript标识符或空
很明显,returnfalse
会将finally的完成类型设置为return,这会导致try。。。最后
要做4件事。返回F.这个怎么样
doubleReturn();
function doubleReturn() {
let sex = 'boy';
try {
return sex;
console.log('this never gets called...');
} catch (e) {} finally {
sex = 'girl';
alert(sex);
}
}
finally块重写try块返回(比喻地说)
我只是想指出,如果您从finally返回某个内容,那么它将从函数返回。但如果在finally中没有“return”字,它将从try块返回值
函数示例(){
试一试{
返回true;
}
最后{
console.log('finally')
}
}
log(示例());
//->最后
//->对
因此-finally-return
重写-try-return的返回
从finally块返回
如果finally
-块返回一个值,则该值将成为返回值
整个try catch finally
语句的值,而不考虑任何
try
和catch
块中的return
语句
参考:我将在这里给出一个稍微不同的答案:是的,try
和finally
块都会被执行,finally
优先于函数的实际“返回”值。但是,这些返回值并不总是在代码中使用
原因如下:
- 下面的示例将使用Express.js中的
res.send()
,它将创建一个HTTP响应并发送它
- 您的
try
和finally
块都将执行此函数,如下所示:
试试看{
//获取数据库记录等。
返回res.send('try');
}捕获(e){
//日志错误
}最后{
返回res.send('finally');
}
此代码将在浏览器中显示字符串try
。此外,该示例将在控制台中显示一个错误。res.send()
函数被调用两次。任何函数都会发生这种情况。try-catch-finally块将使未经训练的人看不清这一事实,因为(就我个人而言)我只将返回值与函数范围相关联
我想你最好的办法是永远不要在块中使用返回。这将使代码过于复杂,并可能掩盖错误
事实上,PHPStorm中设置了一个默认的代码检查规则,它对此给出了一个“警告”:
那么你最后用做什么呢?
我会用最后
来清理东西。对函数返回值不重要的任何内容
如果您仔细想想,这可能是有道理的,因为当您依赖于finally
下的一行代码时,您假设try
或catch
中可能存在错误。但最后2个是错误处理的实际构建块。只需在try
和catch
中使用return
。IE8、Firefox 3.6和Chrome 6:都一样;)我认为拥有多个返回语句并不总是坏事——更多讨论请参见。我也不同意一个返回规则。不过,你永远不应该从终点站回来(在C#中,这甚至是不允许的)。@erikkallen-这是一个很好的观点。返回到T-C-F块之外是最好的,但是示例代码会有点强迫:)@Castrohenge-这不是一个硬性的规则,但是大多数的copunter示例