在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的收益没有更强大,只是更微妙的语法。