Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么“finally”中的返回会覆盖“try”?_Javascript_Return_Try Catch_Try Catch Finally_Try Finally - Fatal编程技术网

Javascript 为什么“finally”中的返回会覆盖“try”?

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 (术语可能

try/catch块中的return语句是如何工作的

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页:

production
TryStatement: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示例