【问题标题】:With V8 JavaScript, is it possible that normal functions `yield` a value?使用 V8 JavaScript,普通函数是否有可能“产生”一个值?
【发布时间】:2013-10-05 23:24:58
【问题描述】:

我知道yield*可以用来写generator,像这样

 function* foo() {
      yield* bar();
      yield 1;
 }
 function* bar() {
      yield 2;
 }

但是如果我有一些正常的函数yield一个值。

  function xx()
  {
      yield 1;
  }

v8 说

  yield 1;
         ^
  SyntaxError: Unexpected number`

这是否意味着yield 只保存了generator 的环境,而不是完整的调用堆栈,并且无法停止和恢复像生成器这样的正常功能?

听说在 FireFox(SpiderMonkey) 中,yield 可以用于不兼容 ES6 的正常功能。

【问题讨论】:

    标签: javascript generator v8 yield


    【解决方案1】:

    是的,yield 仅在生成器中可用。在 ES6 中,生成器由 * 标记,这在 ES6 草案之前的早期 SpiderMonkey 实现中不是这种情况。这就是为什么您可以在 SpiderMonkey 的“正常”函数中使用 yield 的原因——这根本不是正常的,而是一个生成器。

    IOW,无论哪种情况,yield 都属于生成器。而且它总是会产生一个浅的、一次性的延续(但您可以使用yield* 显式委托)。

    【讨论】:

    • 谢谢安德烈亚斯。我接受你的回答。我想知道为什么 ES6 不接受更强大的SpiderMonkey yield。甚至是scheme 中的一流延续,它甚至更强大。我们可以基于continuationSpiderMonkey yield 轻松构建V8 yield。但反过来就很难做到了。
    • 因为我们发现最好在代码中立即区分函数和生成器,而不必搜索整个主体以查找 yield 的出现。它们确实是截然不同的野兽,称呼它们具有完全不同的含义。完整的延续 OTOH 被委员会一致拒绝,因为它们功能强大,并且破坏了网络上现有代码可能假设的各种不变量,因此存在安全风险等问题。
    • 另请注意,SpiderMonkey 的 yield 并没有更强大,它只是更微妙的语法。
    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2018-09-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2019-05-23
    • 2020-11-18
    相关资源
    最近更新 更多