Javascript 执行上下文堆栈。使用生成器函数违反后进先出顺序

Javascript 执行上下文堆栈。使用生成器函数违反后进先出顺序,javascript,ecmascript-6,Javascript,Ecmascript 6,ECMAScript的某些特性可能会违反执行上下文堆栈中正在运行的执行上下文转换的后进先出顺序的规范: 正在运行的执行上下文状态在执行之间的转换 上下文通常以类似后进先出的方式出现在堆栈中。 但是,某些ECMAScript功能需要 运行执行上下文 然而,该规范并没有明确说明具体使用哪种方法 我已经了解到,在使用生成器函数时可能会发生冲突。但我绝对不明白为什么。更糟的是,我在规范的章节中找不到任何提到这一点的地方 function *gen() { yield 1; return

ECMAScript的某些特性可能会违反执行上下文堆栈中正在运行的执行上下文转换的后进先出顺序的规范:

正在运行的执行上下文状态在执行之间的转换 上下文通常以类似后进先出的方式出现在堆栈中。 但是,某些ECMAScript功能需要 运行执行上下文

然而,该规范并没有明确说明具体使用哪种方法

我已经了解到,在使用生成器函数时可能会发生冲突。但我绝对不明白为什么。更糟的是,我在规范的章节中找不到任何提到这一点的地方

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@JonasW. 好吧,但是为什么规范说有一些功能需要REC的非后进先出转换呢?有人可能会说生成器执行上下文在从它返回的
yield
之后仍然存在,但这只是一个术语thing@JonasW. 当然,我在这里谈到术语方面。是的,非常明确地提到了这个时刻,执行上下文一直存在,但我在规范中找不到。但即使它真的这样做了,那么违规又在哪里呢?新的执行上下文在生成器的这个挂起的执行上下文之上不断地出现,不是吗?我不这么认为。当我们调用一个函数时,当前EC被暂停,为该函数创建并执行一个新的EC,然后当函数
return
s时,函数EC被销毁,暂停的EC从堆栈中弹出并继续执行。现在,当我们使用一个生成器时,生成器功能EC可以多次
yield
,这意味着每个
yield
都会停止生成器EC,然后它会从堆栈中弹出调用的EC,继续执行,并且可能会在某个时候恢复执行。不过这只是猜测,我不是语法专家。