1.为何try里面放return,finally还会执行,理解其内部机制
涉及到了一种数据类型:Completion,是js七大标准类型之一
为何try里面放return,finally还会执行
这种行为就是因为Completion Record,在js中,每条语句的执行完成状态都是由Completion Record类型表示的。他有三个字段:
- [[
type]]:表示完成的类型,具体有这些类型:breakcontinuereturnthrownormal
- [[
value]]:表示语句的返回值,如果没有,则是empty; - [[
target]] 表示语句的目标,通常是一个JavaScript标签(标签在后文会有介绍)。
普通语句执行后,得到 [[type]] 为 normal 的 Completion Record,JavaScript引擎遇到这样的Completion Record,会继续执行下一条语句。这些语句中,只有表达式语句会产生 [[value]]。
JavaScript引擎遇到这样的Completion Record,会继续执行下一条语句。这些语句中,只有表达式语句会产生 [[value]]。
假如我们在
控制型语句带有 try语句块中插入了一条return语句,就会产生一个非normal记录,那么整个语句块都会成为非normal类型。这种方式保证了非normal类型的语句可以穿透复杂的语句嵌套结构,从而产生控制效果。if、switch关键字,它们会对不同类型的Completion Record产生反应。
通过上表中的内容,不难理解前文中的例子。因为
finally中的语句必须保证执行,所以当try/catch执行完毕,即使得到了return类型的完成记录,也要执行完finally中的语句。这样,当执行完finally中的语句,才得到最后的结果。前面说Completion Record类型有三个字段,最后一个为[[target]],这涉及到JavaScript中的一个语法,带标签的语句。
标签的作用是一方面是为了注释代码,增加代码的可读性;另一方面,与Completion Record中的target相配合,用于跳到特定语句。例如下面的例子:
希望有用

浙公网安备 33010602011771号