作业和领域一样都是ES6新增的东西。作业是一个抽象操作,当没有其他ECMAScript计算正在进行时,它将启动ECMAScript计算。一个作业抽象操作可以被定义为接受任意一组作业参数。只有当没有正在运行的执行上下文并且执行上下文堆栈为空时,才能启动作业的执行。一旦启动了一个作业的执行,作业将始终执行完成。在当前正在运行的作业完成之前,不能启动其他作业。PendingJob是未来执行Job的请求。PendingJob是内部记录,其字段如下表:
字段名称 | 值 | 含义 |
---|---|---|
[[Job]] | 作业抽象操作的名称 | 这是在执行此PendingJob时执行的抽象操作。 |
[[Arguments]] | 一个List | 当[[Job]]激活时要传递给[[Job]]的参数值的列表。 |
[[Realm]] | 一个领域记录 | 此PendingJob启动时,最初执行上下文的领域记录。 |
[[ScriptOrModule]] | 一个Script Record或Module Record | 此PendingJob启动时,用于初始执行上下文的脚本或模块。 |
[[HostDefined]] | any,默认undefined | 保留字段供需要将附加信息与 pending Job相关联的宿主环境使用。 |
我们可以把[[Job]]看成一个函数,[[Arguments]]是这个函数的参数。
一个作业队列是一个PendingJob记录的FIFO队列。每个作业队列都有一个名称和由ECMAScript编译器定义的一整套可用的作业队列。每个ECMAScript编译器至少具有下表中定义的作业队列。
名称 | 目的 |
---|---|
ScriptJobs | 验证和评估ECMAScript脚本和模块源文本的作业。 |
PromiseJobs | 回应一个承诺的解决的作业 |
Promise的回调就是与PromiseJobs有关。