javascript - catch子句的语句为什么在finally子句执行完成又执行?
PHP中文网
PHP中文网 2017-04-11 13:25:02
[JavaScript讨论组]

菜鸟一枚,感谢各位:
高程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?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
迷茫

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

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

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

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

PHP中文网

不管怎样,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语句是有返回值的,返回值按照上面说的来计算。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号