首页 > 其他分享 >1.为何try里面放return,finally还会执行,理解其内部机制

1.为何try里面放return,finally还会执行,理解其内部机制

时间:2023-03-04 17:24:47浏览次数:41  
标签:语句 Completion return try Record finally

涉及到了一种数据类型:Completion,是js七大标准类型之一

为何try里面放return,finally还会执行

这种行为就是因为Completion Record,在js中,每条语句的执行完成状态都是由Completion Record类型表示的。他有三个字段:

  • [[type]]:表示完成的类型,具体有这些类型:
    • break
    • continue
    • return
    • throw
    • normal
  • [[value]]:表示语句的返回值,如果没有,则是empty;
  • [[target]] 表示语句的目标,通常是一个JavaScript标签(标签在后文会有介绍)。

普通语句执行后,得到 [[type]] 为 normal 的 Completion Record,JavaScript引擎遇到这样的Completion Record,会继续执行下一条语句。这些语句中,只有表达式语句会产生 [[value]]。

JavaScript引擎遇到这样的Completion Record,会继续执行下一条语句。这些语句中,只有表达式语句会产生 [[value]]。

假如我们在try语句块中插入了一条return语句,就会产生一个非normal记录,那么整个语句块都会成为非normal类型。这种方式保证了非normal类型的语句可以穿透复杂的语句嵌套结构,从而产生控制效果。 控制型语句带有 ifswitch关键字,它们会对不同类型的Completion Record产生反应。 通过上表中的内容,不难理解前文中的例子。因为finally中的语句必须保证执行,所以当try/catch执行完毕,即使得到了return类型的完成记录,也要执行完finally中的语句。这样,当执行完finally中的语句,才得到最后的结果。

前面说Completion Record类型有三个字段,最后一个为[[target]],这涉及到JavaScript中的一个语法,带标签的语句。

标签的作用是一方面是为了注释代码,增加代码的可读性;另一方面,与Completion Record中的target相配合,用于跳到特定语句。例如下面的例子:

 

 

 

 

标签:语句,Completion,return,try,Record,finally
From: https://www.cnblogs.com/alwaysrun/p/17178633.html

相关文章