We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Job 是抽象操作,当 当前没有其他ECMAScript计算正在进行时,它将启动ECMAScript计算。可以将 Job 抽象操作定义为接受任意一组任务参数。
只有当 没有运行时执行上下文 并且 执行上下文栈为空 时任务才会被启动执行。PendingJob 是对将来执行任务的请求。PendingJob 是一个内置的 Record,字段见下表:
[[Job]]
一旦某个任务启动执行,该任务将会一直执行直到完成。在当前运行的任务完成前,其它任何任务都不会启动。 但是,当前正在运行的任务或外部事件可能会导致其他 PendingJob 排队,这些任务可能在当前正在运行的任务完成后的某个时间启动。
任务队列是PendingJob记录的先进先出队列。每个任务队列都有名字并且完整的可用任务队列集由ECMAScript实现定义。每个ECMAScript实现至少有下表中列出的 两种 任务队列:
通过在任务队列上使包含任务抽象操作名称和任何必要参数值的 PendingJob 记录入队,来请求将来执行任务。当没有运行时执行上下文和执行上下文栈为空时,ECMAScript的实现从任务队列中移除第一个 PendingJob 并且使用 PendingJob 包含的信息创建执行上下文并同时始执行关联的Job抽象操作。
来自单个任务队列的 PendingJob 记录始终以先进先出顺序启动。规范没有定义服务多个任务队列的顺序。 ECMAScript实现可以将任务队列的 PendingJob 记录的先进先出求值与一个或多个其他任务队列的 PendingJob 记录的求值交织在一起。一个实现必须定义当没有运行时执行上下文并且所有任务队列为空时会发生什么。
通常,ECMAScript实现将使用至少一个 PendingJob 预先初始化其任务队列,并且其中一个任务将是第一个要执行的任务。
如果当前任务完成并且所有任务队列为空,则实现可以选择释放所有资源并终止。或者,它可以选择等待某些特定于实现的代理或机制来排队新的 PendingJob 请求。
创建和管理任务以及任务队列的步骤:
queueName
job
arguments
callerContext
callerRealm
callerScriptOrModule
pedding
PendingJob { [[Job]]: job, [[Arguments]]: arguments, [[Realm]]: callerRealm, [[ScriptOrModule]]: callerScriptOrModule, [[HostDefined]]: undefined }.
[[HostDefined]]
任务队列的执行步骤:
sourceText
hostDefined
EnqueueJob("ScriptJobs", ScriptEvaluationJob, « sourceText, hostDefined »)
EnqueueJob("ScriptJobs", TopLevelModuleEvaluationJob, « sourceText, hostDefined »)
nextQueue
nextPending
newContext
Function
Realm
nextQueue.[[Realm]]
ScriptOrModule
nextPending.[[ScriptOrModule]]
result
nextPending.[[Job]]
nextPending.[[Arguments]]
normal
经典面试题:
console.log('start') setTimeout(() => console.log('setTimeout'), 0) new Promise(res => { console.log('new Promise') res() }).then(val => console.log('Promise then')) console.log('end') // 合理的打印结果为(有的浏览器实现有问题) start new Promise end Promise then setTimeout
这条题涉及到 宏任务 和 微任务 概念,可惜本文全篇都没有提到这两个术语,而且,整个规范都没有提到!!! 我就懵逼了,难不成不是规范,那么为何有那么多人统一叫这两个专业术语呢??? 后来看知乎才知道,这两个术语出自 HTML Event Loops规范!!!
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Jobs and Job Queues
Job 是抽象操作,当 当前没有其他ECMAScript计算正在进行时,它将启动ECMAScript计算。可以将 Job 抽象操作定义为接受任意一组任务参数。
只有当 没有运行时执行上下文 并且 执行上下文栈为空 时任务才会被启动执行。PendingJob 是对将来执行任务的请求。PendingJob 是一个内置的 Record,字段见下表:
[[Job]]
的参数列。一旦某个任务启动执行,该任务将会一直执行直到完成。在当前运行的任务完成前,其它任何任务都不会启动。 但是,当前正在运行的任务或外部事件可能会导致其他 PendingJob 排队,这些任务可能在当前正在运行的任务完成后的某个时间启动。
任务队列是PendingJob记录的先进先出队列。每个任务队列都有名字并且完整的可用任务队列集由ECMAScript实现定义。每个ECMAScript实现至少有下表中列出的 两种 任务队列:
通过在任务队列上使包含任务抽象操作名称和任何必要参数值的 PendingJob 记录入队,来请求将来执行任务。当没有运行时执行上下文和执行上下文栈为空时,ECMAScript的实现从任务队列中移除第一个 PendingJob 并且使用 PendingJob 包含的信息创建执行上下文并同时始执行关联的Job抽象操作。
来自单个任务队列的 PendingJob 记录始终以先进先出顺序启动。规范没有定义服务多个任务队列的顺序。 ECMAScript实现可以将任务队列的 PendingJob 记录的先进先出求值与一个或多个其他任务队列的 PendingJob 记录的求值交织在一起。一个实现必须定义当没有运行时执行上下文并且所有任务队列为空时会发生什么。
EnqueueJob ( queueName, job, arguments )
创建和管理任务以及任务队列的步骤:
queueName
)是 String 类型并且其值是被实现认可的任务队列的名字。job
是任务的名字。arguments
是一个具有与任务所需参数数量相同的元素数量的列表。callerContext
保存运行时执行上下文。callerRealm
成为callerContext
的领域。callerScriptOrModule
成为callerContext
的 ScriptOrModule。pedding
,初始值为PendingJob { [[Job]]: job, [[Arguments]]: arguments, [[Realm]]: callerRealm, [[ScriptOrModule]]: callerScriptOrModule, [[HostDefined]]: undefined }.
pedding
处理。这可能包括修改[[HostDefined]]
字段或pedding
的任何其他字段。queueName
命名的任务队列的后面添加pedding
。RunJobs ()
任务队列的执行步骤:
sourceText
和hostDefined
:sourceText
是脚本源代码,那么EnqueueJob("ScriptJobs", ScriptEvaluationJob, « sourceText, hostDefined »)
.sourceText
是模块源代码EnqueueJob("ScriptJobs", TopLevelModuleEvaluationJob, « sourceText, hostDefined »)
nextQueue
,让它成为以实现定义的方式选择的非空任务队列。如果所有的任务队列为空,那么结果由实现定义。nextPending
,令其为nextQueue
前面的 PendingJob 记录。从nextQueue
移除该记录。newContext
作为新的执行上下文。newContext
的Function
字段值为 null。newContext
的Realm
字段值为nextQueue.[[Realm]]
。newContext
的ScriptOrModule
字段值为nextPending.[[ScriptOrModule]]
。newContext
推入执行上下文栈中;这时newContext
位于栈顶,成为当前的运行时执行上下文。nextPending
执行任何实现或主机环境定义的任务初始化。result
,使其成为 执行由nextPending.[[Job]]
定义并使用了nextPending.[[Arguments]]
作为参数的 抽象操作的 结果。result
是一个abrupt completion(非normal
类型的completion),执行HostReportErrors(« result.[[Value]] »)。注意
经典面试题:
这条题涉及到 宏任务 和 微任务 概念,可惜本文全篇都没有提到这两个术语,而且,整个规范都没有提到!!!
我就懵逼了,难不成不是规范,那么为何有那么多人统一叫这两个专业术语呢???
后来看知乎才知道,这两个术语出自 HTML Event Loops规范!!!
拓展阅读
The text was updated successfully, but these errors were encountered: