JavaScript执行(四):try里面放return,finally还会执行吗?
winter
该思维导图由 AI 生成,仅供参考
你好,我是 winter。
在前面几篇文章中,我们已经了解了关于执行上下文、作用域、闭包之间的关系。
今天,我们则要说一说更为细节的部分:语句。
语句是任何编程语言的基础结构,与 JavaScript 对象一样,JavaScript 语句同样具有“看起来很像其它语言,但是其实一点都不一样”的特点。
我们比较常见的语句包括变量声明、表达式、条件、循环等,这些都是大家非常熟悉的东西,对于它们的行为,我在这里就不赘述了。
为了了解 JavaScript 语句有哪些特别之处,首先我们要看一个不太常见的例子,我会通过这个例子,来向你介绍 JavaScript 语句执行机制涉及的一种基础类型:Completion 类型。
Completion 类型
我们来看一个例子。在函数 foo 中,使用了一组 try 语句。我们可以先来做一个小实验,在 try 中有 return 语句,finally 中的内容还会执行吗?我们来看一段代码。
通过实际试验,我们可以看到,finally 确实执行了,而且 return 语句也生效了,foo() 返回了结果 0。
虽然 return 执行了,但是函数并没有立即返回,又执行了 finally 里面的内容,这样的行为违背了很多人的直觉。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
JavaScript执行(四):try里面放return,finally还会执行吗?本文深入探讨了JavaScript语句执行机制中的Completion类型,以及普通语句、语句块、控制型语句和带标签的语句等内容。通过具体的代码示例和实验,解释了在try语句中放置return时,finally中的内容是否会执行,以及finally中的return语句对try中return的影响。文章通过Completion Record类型为线索,讲解了JavaScript语句执行的原理,强调了语句执行过程实际上主要在一个树形结构上进行,根据语句的结构和Completion Record,JavaScript实现了各种分支和跳出逻辑。读者可以通过本文了解JavaScript语句执行的细节和特殊情况,以及Completion Record类型在控制语句执行过程中的作用。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《重学前端》,新⼈⾸单¥59
《重学前端》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(59)
- 最新
- 精选
- csᵏᵒᵖwinter老师,特殊处理就是指后面的 “因为 finally 中的内容必须保证执行,所以 try/catch 执行完毕,即使得到的结果是非 normal 型的完成记录,也必须要执行 finally“ 吗
作者回复: 没错,就是这个。
2019-10-2627 - 小say老师你好,前面说[[value]]如果没有返回值就是empty但是为什么在Chrome调试器下显示的是undefined? 后文中语句块中 { var i = 1; // normal, empty, empty i ++; // normal, 1, empty console.log(i) //normal, undefined, empty } // normal, undefined, empty 其中 var i = 1; 为什么[[value]]会是empty?console.log(i)的[[value]]为什么是undefined?所以到底什么时候是empty什么时候是undefined?
作者回复: 是Chrome自己的规定。
2019-09-176 - Smallflywinter 老师,有什么工具能查看 JS 引擎的运行时的特殊类型么?
作者回复: 不能,事实上引擎不一定需要按照标准的模型来实现,只要保证运行效果等效即可。
2019-10-172 - PuruPython 也是先执行finally后执行return
作者回复: 所有有这个的语言都是这个行为。
2019-06-2521 - 尤璐洁winter老师,这些个私有属性的值执行时的值是如何得出的,是靠分析,还是说有某种方式可以看到验证呢?
作者回复: 这是个概念模型,标准这样讲的,但是其实实现不一定这么实现,只要保证跟这个模型等效即可。
2019-10-23 - 东void function() { if(true){ console.log(1) break console.log(2) } }() 在if中用break、continue会报错VM506:4 Uncaught SyntaxError: Illegal break statement,而不是穿透,为什么和表格举出的不一致呢
作者回复: 穿透的意思是交给外层处理,你外面没循环当然还是报错。
2019-07-093 - 热爱减肥的胖子请问,上图上那个“特殊处理”怎么理解?
作者回复: 后面一句就是特殊处理。
2019-06-26 - 有铭很感兴趣这些高级特性的知识老师是从哪里学到的,我翻过js高级编程那本书都没讲到过这些2019-03-02898
- 周小成穿透和消费,报错应该是连贯的,“穿透”就是指不在当前这一层处理,向外逐层寻找可以“消费”的那一层,直到最后都没找到就报错,比如:function里面有while, while里面有switch, switch里面又有continue,按图表来看,switch-continue应该是穿透,向上层寻找消费,碰到while-contine,那就是消费,再如switch里面是return, switch-return穿透,向上层whlie-return穿透,最后function-return是消费。2019-03-12387
- Rushan-Chen请问老师,表格中的“穿透”和“消费”是什么意思?2019-03-021359
收起评论