ECMAScript : 关于 Job 和 Job queue 的一些问题
ECMAScript : Some questions about Job and Job queue
这个问题关于 ECMAScript 规范(ECMA-262 第 8 版)
这些天,我对作业和作业队列有点困惑。
这里有一些问题。
1: 在ECMA-262中,有两种Job Queue。一个是 ScriptJobs
另一个是 PromiseJobs
。那么,一个有偏好吗?
2:在ECMA-262中,只有RunJobs
抽象操作的定义。我想知道 RunJobs
执行的时间和地点?
3.I 执行代码 blow,在 FF 60 中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.addEventListener('DOMContentLoaded', () => {
let x = document.createElement('script');
x.innerHTML = 'console.log(3);';
console.log('script start');
document.body.appendChild(x);
setTimeout(() => console.log(1), 0);
Promise.resolve(2).then(console.log);
console.log('script is end');
});
</script>
</head>
<body>
</body>
</html>
并记录:
script start
3
script end
2
1
为什么 script
元素在动态创建的执行上下文中执行?
c. Let nextQueue be a non‐empty Job Queue chosen in an implementation‐defined manner. If all
Job Queues are empty, the result is implementation‐defined.
从 ECMA-262 RunJobs 分叉。
HTML 规范如何定义 实现定义的方式?
@Bergi 喜欢这样吗?
PromiseJobs:[],ScriptJobs:[]
ScriptJobs.push(something);
// pop and run by Event loop
// blow will happens while `something` runs
PromiseJobs.push(anotherOne);
ScriptJobs.push(theother);
//end of `something`
//and in here, PromiseJobs will pop?
Which one have preference?
都没有。规范 states“此规范未定义服务多个作业队列的顺序。”队列只是指定每个队列 的工具,作业以 FIFO 顺序执行。
I want to know when and where the RunJobs
execute?
这在很大程度上取决于实施。在像 node.js 这样的环境中,它将在进程启动时调用 - 这是基本的事件循环公式。当然会有更多的工作队列,例如用于定时器或异步 IO 操作。
Why script element execute on execution context that created dynamically?
因为 HTML 规范很奇怪。看看https://www.html5rocks.com/en/tutorials/speed/script-loading/ or load and execute order of scripts for an overview. The details can be found in the HTML5 processing model for script elements,基本上是
- 当脚本元素连接时(即插入到DOM),
- 准备一切并加载它(如果需要)并进行各种检查,
- 如果元素没有
src
属性并且是经典脚本(不是模块)并且未插入解析器,
- 然后“立即执行脚本块,即使其他脚本已经在执行。”
是的,这使浏览器的 ECMAScript 队列模型完全无效。这也在 Integration with the JavaScript job queue.
部分中明确说明
这个问题关于 ECMAScript 规范(ECMA-262 第 8 版)
这些天,我对作业和作业队列有点困惑。
这里有一些问题。
1: 在ECMA-262中,有两种Job Queue。一个是 ScriptJobs
另一个是 PromiseJobs
。那么,一个有偏好吗?
2:在ECMA-262中,只有RunJobs
抽象操作的定义。我想知道 RunJobs
执行的时间和地点?
3.I 执行代码 blow,在 FF 60 中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.addEventListener('DOMContentLoaded', () => {
let x = document.createElement('script');
x.innerHTML = 'console.log(3);';
console.log('script start');
document.body.appendChild(x);
setTimeout(() => console.log(1), 0);
Promise.resolve(2).then(console.log);
console.log('script is end');
});
</script>
</head>
<body>
</body>
</html>
并记录:
script start
3
script end
2
1
为什么 script
元素在动态创建的执行上下文中执行?
c. Let nextQueue be a non‐empty Job Queue chosen in an implementation‐defined manner. If all Job Queues are empty, the result is implementation‐defined.
从 ECMA-262 RunJobs 分叉。 HTML 规范如何定义 实现定义的方式?
@Bergi 喜欢这样吗? PromiseJobs:[],ScriptJobs:[]
ScriptJobs.push(something);
// pop and run by Event loop
// blow will happens while `something` runs
PromiseJobs.push(anotherOne);
ScriptJobs.push(theother);
//end of `something`
//and in here, PromiseJobs will pop?
Which one have preference?
都没有。规范 states“此规范未定义服务多个作业队列的顺序。”队列只是指定每个队列 的工具,作业以 FIFO 顺序执行。
I want to know when and where the
RunJobs
execute?
这在很大程度上取决于实施。在像 node.js 这样的环境中,它将在进程启动时调用 - 这是基本的事件循环公式。当然会有更多的工作队列,例如用于定时器或异步 IO 操作。
Why script element execute on execution context that created dynamically?
因为 HTML 规范很奇怪。看看https://www.html5rocks.com/en/tutorials/speed/script-loading/ or load and execute order of scripts for an overview. The details can be found in the HTML5 processing model for script elements,基本上是
- 当脚本元素连接时(即插入到DOM),
- 准备一切并加载它(如果需要)并进行各种检查,
- 如果元素没有
src
属性并且是经典脚本(不是模块)并且未插入解析器, - 然后“立即执行脚本块,即使其他脚本已经在执行。”
是的,这使浏览器的 ECMAScript 队列模型完全无效。这也在 Integration with the JavaScript job queue.
部分中明确说明