你不知道的JS中 try..finally

570 阅读1分钟

思考下面代码的执行顺序

 function foo() {
      try {
        return 42;
      } finally {
        console.log('hello')
      }
      console.log('never runs')
    }
 console.log(foo())   //  hello   42

这里的return 42先执行,并将foo()函数的返回值设置为42.然后 try 执行完毕,接着执行finally.最后foo()函数执行完毕,console.log(...)显示返回值.

1.如果 finally 中抛出异常,函数就回在此处终止。如果此前try中已经有return设置了返回值,则该值会被丢弃.

function foo() {
      try {
        return 42;
      } finally {
        throw '999'
      }
      console.log('never runs')
    }
    console.log(foo())  // Uncaught Exception : 999

2.finally 中如果return,finally的 return 会覆盖try和catch中return的返回值。

3.finally 中省略 return 则会返回前面的 return 设定的返回值。

事实上,可以将finally和带标签的break混合使用。(不要用标签语法求求你 会被打)

 function foo() {
      bar: {
        try {
          return 42;
        } finally {
          break bar
        }
      }
      console.log('999')
      console.log('888')
    }
    console.log(foo())  // 999    888