作业和领域一样都是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有关。