在V8 JavaScript中,普通函数是否可能“产生”一个值?
我知道在V8 JavaScript中,普通函数是否可能“产生”一个值?,javascript,generator,v8,yield,Javascript,Generator,V8,Yield,我知道yield*可以用来组成生成器,就像这样 function* foo() { yield* bar(); yield 1; } function* bar() { yield 2; } 但是如果我有一些正常的函数产生一个值 function xx() { yield 1; } v8说 yield 1; ^ SyntaxError: Unexpected number` 这是否意味着yield
yield*
可以用来组成生成器
,就像这样
function* foo() {
yield* bar();
yield 1;
}
function* bar() {
yield 2;
}
但是如果我有一些正常的函数产生一个值
function xx()
{
yield 1;
}
v8说
yield 1;
^
SyntaxError: Unexpected number`
这是否意味着yield
只保存了生成器的环境,而不是完整的调用堆栈,并且无法停止和恢复像生成器这样的正常功能
我在FireFox(SpiderMonkey)中听说,yield
可用于与ES6不兼容的正常功能。是的,yield
仅在生成器中可用。在ES6中,生成器由*
标记,而在ES6草案之前的早期SpiderMonkey实现中,情况并非如此。这就是为什么您可以在SpiderMonkey中的“normal”函数中使用yield
——这样就根本不正常了,实际上是一个生成器
在这两种情况下,yield
都属于生成器。而且它总是产生一个浅薄的、一次性的延续(但您可以使用yield*
显式委托)。谢谢Andreas。我接受你的回答。我想知道为什么ES6不接受更强大的SpiderMonkey-yield
。甚至是方案
中的一级延续,其功能更加强大。我们可以基于continuation
或SpiderMonkey-yield
轻松构建V8-yield
。但是,用另一种方法很难做到这一点,因为我们发现最好是在代码中立即明确函数和生成器之间的区别,而不必在整个代码中搜索是否出现了yield
。它们是完全不同的动物,称呼它们有完全不同的含义。委员会一致拒绝了全面的延续OTOH,因为它们太强大了,并且破坏了web上现有代码可能假设的各种不变量,因此存在安全风险,以及其他问题。还要注意的是,SpiderMonkey的收益没有更强大,只是更微妙的语法。