我有以下代码:
function f() {
var a = 5;
try {
return a;
} finally {
a = 3;
}
}
console.log(f()); // returns 5 instead of 3, why?
答案 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()));