思考下面代码的执行顺序
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