【问题标题】:How does this generator returns 3?这个生成器如何返回 3?
【发布时间】:2020-01-31 00:42:17
【问题描述】:

在尝试理解生成器时,而不是跟随:

function* powerSeries(number,power) {
  let base = number;
  while (true) {
    yield Math.pow(base, power);
    base++
  }
}

let n = powerSeries(3,2)
n.next() // value: 9
n.next() // value: 16
...

我试过了:

function* powerSeries(number,power) {
  let base = number;
  yield Math.pow(base, power);
  return base++ // was trying to understand what happens if using return
}

let n = powerSeries(3,2)
n.next() // value: 9
n.next() // value: 3 But how ????

我可以理解后期增量没有完成,因为它不在循环内。因此,基数保持为 3。但是,它是如何变成 1 的,所以结果是 3?

确认: 谢谢大家。我很困惑,如果我使用 return 语句,那么它仍然会调用 yield。

【问题讨论】:

  • 返回 base,而不是Math.pow(base, power)base === 3。没有1的幂;在第二个 .next 没有任何东西被取幂。
  • 是的,我是故意这样做的。而且我已经同意我的问题,即基数为 3,因为它不在循环内。但是权力是如何变成 1 的呢?
  • 阅读我编辑的评论。
  • 你认为power为什么会变成1?它仍然是 2,但在单个 yield 语句(产生你看到的 9)之后,它再也没有使用过。
  • @gulcy “啊,你的意思是没有使用 yield 而只是返回语句?” — 是的,当然。为什么yield会再次被执行?请改用yield ["yield", Math.pow(base, power)]; return ["return", base++]。你看到两个yields 了吗?不;你会得到["yield", 9]["return", 3]

标签: javascript ecmascript-6 generator yield


【解决方案1】:

来自yield

Description

[...]

到达return 语句。在这种情况下,生成器的执行结束,IteratorResult 被返回给调用者,其中valuereturn 语句指定的值,done 是true

function* powerSeries(number,power) {
  let base = number;
  yield Math.pow(base, power);
  return base++ // was trying to understand what happens if using return
}

let n = powerSeries(3,2)
console.log(n.next().value); // 9
console.log(n.next().value); // 3
console.log(n.next().value); // undefined

【讨论】:

  • 谢谢。我现在完全明白了。
猜你喜欢
  • 2018-12-13
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2017-12-16
  • 1970-01-01
  • 2016-07-24
  • 2020-09-07
相关资源
最近更新 更多