Javascript 如果始终执行finally,为什么try返回未分页的值

Javascript 如果始终执行finally,为什么try返回未分页的值,javascript,Javascript,我有以下代码: function f() { var a = 5; try { return a; } finally { a = 3; } } console.log(f()); // returns 5 instead of 3, why? 返回a时读取a的值;执行,然后执行finally块。读取后更改的值不会更改返回值 如果在finally块中写入return 3而不是a=3,则会看到返回值已更改。当返回a时,将读取a的值

我有以下代码:

function f() {
    var a = 5;
    try {
        return a;
    } finally {
        a = 3;
    }
}

console.log(f()); // returns 5 instead of 3, why?
返回a时读取a的值;执行,然后执行finally块。读取后更改的值不会更改返回值

如果在finally块中写入return 3而不是a=3,则会看到返回值已更改。

当返回a时,将读取a的值;执行,然后执行finally块。读取后更改的值不会更改返回值


如果在finally块中写入return 3而不是a=3,则会看到返回值已更改。

即使尝试后执行finally块,也无法更改已返回的值。由于a具有基元类型,已返回的值与f函数中留下的值没有连接,因为它们是副本,但不再是相同的实例

要证明以上内容,请参见它将如何处理通过引用传递的对象:

函数f{ var a={value:5}; 试一试{ 返回a; }最后{ a、 数值=3; } }
alertJSON.stringifyf 即使在尝试之后执行finally块,它也不能更改已经返回的值。由于a具有基元类型,已返回的值与f函数中留下的值没有连接,因为它们是副本,但不再是相同的实例

要证明以上内容,请参见它将如何处理通过引用传递的对象:

函数f{ var a={value:5}; 试一试{ 返回a; }最后{ a、 数值=3; } }
alertJSON.stringifyf;返回5而不是3,为什么?。因为没有抛出异常,所以5只是毫无问题地返回。但是finally被执行了,否?@dfsq:这意味着finally并不总是被执行,只在抛出异常时执行?!在尝试之后运行finally。@这里不涉及Veverke作用域,这与a的作用域无关。返回5而不是3,为什么?。因为没有抛出异常,所以5只是毫无问题地返回。但是finally被执行了,否?@dfsq:这意味着finally并不总是被执行,只在抛出异常时执行?!finally在try之后运行。@此处不涉及Veverke作用域,这与a的作用域无关。感谢您在finally块中更改对象而不是原语的备注!即使在尝试之后执行finally块,它也不能更改已经返回的值。这是不真实的。您可以从finally中返回,这将更改函数的返回值。@meagar是的,它是正确的。我的意思是,在这种情况下,更改in finally块不会更新已经返回的值。但是可以,您可以返回新值。谢谢您关于在finally块中更改对象而不是原语的评论!即使在尝试之后执行finally块,它也不能更改已经返回的值。这是不真实的。您可以从finally中返回,这将更改函数的返回值。@meagar是的,它是正确的。我的意思是,在这种情况下,更改in finally块不会更新已经返回的值。但是,可以返回新值。