为什么age值是函数return返回值而不是finally中赋的值?

我这边打断点调试发现age的值并不是finally中赋的值而是fn函数return的值,请问这是怎么回事?

let age = 66
function fn() {
    try {
        console.log('try')
        age =  'try ' + age
        return age
    }finally {
        age = 'finally ' + age // 变量age被赋值成了 'finally 66'
        console.log('finally')
    }
}
age = fn()
console.log('age: ', age) // 'age: try 66'

函数内先将变量age赋值成try 66然后执行finally中的代码age又被赋值成了finally 66但是age又被赋值成了try 66
请问为什么后面age又会被赋值成try 66?

阅读 2k
4 个回答

每个age的赋值情况如下

let age = 66
function fn() {
    try {
        console.log('try')
        age =  'try ' + age // age = try 66
        return age
    }finally {
        age = 'finally ' + age // age = finally try 66
        console.log('finally')
    }
}
age = fn() // 因为finally没有return,所以fn的返回值为try中的return,故 age = try 66
console.log('age: ', age) // 'age: try 66'

你的age 是在try 中已经 return 了,finally 根本没有返回任何东西啊

因为 age = fn() 你赋值了呀,而 fn 的返回值在 try 块里已经确定了;

试试这样?

fn()
console.log('age: ', age)

其实只要做以下修改,马上就能体现出来区别了。

let age = 66
function fn() {
    try {
        console.log('try')
        age =  'try ' + age
        return age
    } finally {
        age = 'finally ' + age // 变量age被赋值成了 'finally 66'
        console.log('finally')
    }
}
- age = fn()
+ fn()
console.log('age: ', age) // 'age: try 66'

没有做赋值,则会输出 age: finally try 66,如果做了赋值则会返回 age: try 66
其实就是什么时候赋值的问题,一个是先把 age 赋值为了 'finally ' + age,如果调用的时候有赋值,就又会吧 age 赋值为 return 出来的 'try ' + age

看起来就是 try...finally 里面虽然 try 里面 return 了,但是代码是正常执行完毕的,所以 finally 块中的赋值代码依旧会执行的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题