某些ECMAScript特性可能违反了执行上下文堆栈中正在运行的执行上下文的LIFO顺序转换的规范says:
执行期间正在运行的执行上下文状态的转换 上下文通常以堆栈式的后进/先出方式发生。 但是,某些ECMAScript功能需要非LIFO转换 运行执行上下文。
然而,规范并没有明确说明具体到底是什么。
我已经读过使用发电机功能时可能发生的违规行为。但我绝对不明白为什么。 Morover我无法在规范的25.3.3部分找到任何提及的内容。
function *gen() {
yield 1;
return 2;
}
let g = new gen();
console.log(g.next().value);
// some other operations
console.log(g.next().value);
据我所知,上面的例子中执行上下文堆栈的生命周期可能如下所示:
EC(global)
->
EC(gen1)
EC(global)
->
EC(global)
->
EC(gen2)
EC(global)
->
EC(global)
所以我在这里看不到任何LIFO违规行为。
可能是发电机功能甚至不会导致这种违规行为?或者,可能是,我误读了规范。无论如何,你能否解释一下使用生成器时执行上下文栈的情况?并且运行执行上下文转换的LIFO顺序如何(以及为什么)违反了?