如果finally总是执行,为什么尝试返回未更改的值

时间:2015-03-22 17:30:39

标签: javascript

我有以下代码:

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

console.log(f()); // returns 5 instead of 3, why?

2 个答案:

答案 0 :(得分:6)

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

如果您在finally块而不是return 3中编写a = 3,那么您将看到返回值已更改。

答案 1 :(得分:1)

即使最终块在try之后执行,它也无法更改已返回的值。由于a具有基本类型,因此已返回的值与f函数内部留下的值没有任何关联,因为它们是副本但不再是相同的实例

为证明上述情况,请参阅通过引用传递的对象的行为:



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

alert(JSON.stringify(f()));