完成记录Completion Record

61 篇文章 1 订阅

在控制台进行操作时,我们会发现, var 语句返回值为undefined,由此引发深思…

我们在浏览器的控制台输入 abd = 2 时会打印 2,但是输入 var abd = 2 得到的结果却是 undefined,这是什么原因呢?

普通语句执行后会得到 [[type]]值为normal的 Completion Record,所以普通语句执行完成之后就继续执行下一条,而只有表示式语句才会有 [[value]]值,不过这个[[value]]对于引擎执行逻辑来说没有什么用处,var语句执行得到的是一个[[vaue]]值为空的Completion Record。

普通语句和语句块

普通语句:

  • 声明类(var 声明语句、const 声明语句、let 声明语句、函数声明语句、class 声明语句)
  • 表达式语句(比如 abc = 3)
  • 空语句
  • debugger语句

语句块:

  • js中带有括号的都是一个语句块,包含小括号和大括号

完成记录Completion Record

一般编程语言都有一个规律:用一定的文法和词法,表达一定的语义,去操作运行时Completion Record就是js运行时的一种基础类型,它表示语句的执行结果。

不同的语句在执行的过程中,completion值不同,而它的值决定了语句的执行逻辑

JavaScript 用语句来完成流程控制

if (x === 1) return 10;

这是一条简单的 if 语句,它的完成状态可能是不一样的,return 有可能会执行也有可能不会执行取决于 x 变量具体的值。

所以 JavaScript 引擎在解析if语句的时候就需要知道它完成之后的结果到底是怎样的。于是在 JavaScript 语言中就需要一种数据结构来存储语句的完成结果,这就是我们所谓的 Completion Record 类型了,它不在其中基本类型中,我们在 JavaScript 中无论如何都是无法获取到这个数据,它没有办法赋值给变量也没有办法作为参数,但是它确确实实存在于 JavaScript 的运行时。

每写一条语句就会产生 Completion Record 这样的东西,比如上面的if语句,它的 Completion Record 可能包含了这些信息:是否返回了?返回值是啥?等等…

接下来我们就来看看一个具体的 Completion Record 是怎样组成的

[[type]]: 表示完成类型,有break、continue、return、throw和normal几种
[[value]]: 基本类型值,表示返回的值,如果语句没有返回值,那就为empty
[[target]]:label,表示语句的目标值,及语句前面加的标签

type 部分是它的类型,正常的语句它都是 normal,有些语句可能会产生 break,continue,return,or throw,type 是一个非常关键的信息。

值得注意的是,比如说我们的if语句或者说我们for循环,它里面都有可能产生 return,break,continue,这些穿透力比较强的 type 可能会改变父语句的 type

// 函数被直接返回了
function foo() {
  if (true) {
    return true;
  }
}

value:有些语句,尤其是表达式语句,他一定是有一个返回值的,正因为它有返回值,所以它才能发挥一定的作用,另外 return,throw,它都会带着一个值,这个值也是控制中的一个关键,这个值可能会被抛给其他的语句或者是赋值给一些变量去执行,所以 value 也是 Completion Record 里面一个重要的信息

target:这个非常少见 target 是一个 label,这个东西其实就是我们在语句前面加上一个标识符和冒号,然后这样的话这个语句就变成了一个带 label 的语句。

// label 可以和break,continue 配合使用达到一些如跳出指定循环的效果
outPoint: for (let i = 0; i < 100; i++) {
  for (let j = 0; j < 10; j++) {
    console.log(i, j);
    if (i === 55 && j === 5) {
      break outPoint;
    }
  }
}

以上就是 JavaScript 中的 Completion Record 了,我们单看 Completion Record,其实他就是一个语句完成状态的这样的一个记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值