catch子句的语句为什么在finally子句执行完成又执行?

菜鸟一枚,感谢各位:
高程3上说“只要代码中包含 finally 子句,那么无论 try 还是 catch 语句块 中的 return 语句都将被忽略。”但是我做的一个测试出现了这样的结果:

var example = function() {
  try {
    window.someNonexistentFunction();
  } catch (error) {
    console.log(error.name);
    console.log(error.message);
    return 1;
  } finally {
    console.log('everything is over');
  }
};
example();

Firebug中的输出:最后为什么会输出1?
图片描述

阅读 2.5k
3 个回答

这里的忽略不是形式上的忽略,而指得是结果上的忽略,实际上其他分支上的return值是被最后的finally语句的return值覆盖了。

如下,我在finally分支添加了一句“return 0”,则结果是整个代码块返回了0:

clipboard.png

而关于你的问题:“catch子句的语句为什么在finally子句执行完成又执行?”

这里理解偏差了,代码执行过程依然是先执行catch,再执行finally,只不过catch分支设置了函数的返回值,而finally没设置,所以最后函数还是返回1。

不管怎样,finally都会执行

http://www.ecma-international...

The production TryStatement : try Block Catch Finally is evaluated as follows:   
 1. Let B be the result of evaluating Block.
 2. If B.type is throw, then
 3. Let C be the result of evaluating Catch with parameter B.value.
 4. Else, B.type is not throw,
 5. Let C be B.
 6. Let F be the result of evaluating Finally.
 7. If F.type is normal, return C.
 8. Return F.

整个try语句是有返回值的,返回值按照上面说的来计算。

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