【问题标题】:Understanding generators in JavaScript了解 JavaScript 中的生成器
【发布时间】:2015-06-07 22:29:55
【问题描述】:

谁能帮我理解下面的代码在做什么?为什么“一个”没有打印到控制台?另外,g 是生成器还是 go 生成器?

function *go() {
  var foo = yield;
  console.log(foo);
}

var g = go();
console.log(g.next('one')); 
console.log(g.next('two')); 

输出:

Object {value: undefined, done: false}
two
Object {value: undefined, done: true}

【问题讨论】:

  • @Juhana - 你为什么把运行 sn-p 功能放在这里?
  • ...这样人们就可以自己尝试了吗?这就是它的用途。

标签: javascript generator yield ecmascript-6


【解决方案1】:

第一行是yield的对象结果。这个值是未定义的,因为在 yield 关键字后面什么都没有,但是函数没有完成。

这两个是由函数中的log函数打印出来的。

第三行是函数结束值仍然未定义(没有返回语句或值)并且函数完成的结果。

【讨论】:

    【解决方案2】:

    为什么控制台不打印“one”?

    因为第一个.next() 调用(通常没有参数)只会将生成器从函数体代码的开头推进到第一个yield 表达式(并返回在那里产生的值)。 “传入”的值无法在任何地方访问。

    只有第二个 .next(…) 调用然后提供来自 yield 表达式的值,将生成器状态继续到下一个 yield 或函数结束。

    另外,g 是生成器还是 go 生成器?

    ggenerator(它也是一个 iterator)。 go 是一个生成器函数,它创建生成器(就像构造函数创建实例一样)。

    【讨论】:

    • 谢谢。并且传入next 调用的值成为对应的yield 语句返回的值。
    【解决方案3】:

    只是为了加入讨论。这是一个演示,展示了我认为您想要实现的目标。引用Mozilla docs

    调用生成器函数不会立即执行其主体;而是返回函数的迭代器对象。当迭代器的 next() 方法被调用时,生成器函数的主体被执行,直到第一个 yield 表达式,它指定要从迭代器返回的值,或者使用 yield* 委托给另一个生成器函数。 next() 方法返回一个对象,它的 value 属性包含产生的值和 done 属性,指示生成器是否产生了最后一个值。

    function* go(values) {
      while (values.length) {
        yield values.shift();
      }
    }
    
    var g = go(['one', 'two']);
    document.getElementById("output").innerHTML += JSON.stringify(g.next());
    document.getElementById("output").innerHTML += JSON.stringify(g.next());
    // I'm done!
    document.getElementById("output").innerHTML += JSON.stringify(g.next());
    <pre id="output"></pre>

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 2010-12-17
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2021-08-11
      • 2021-04-07
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多