代码之家  ›  专栏  ›  技术社区  ›  Homunculus Reticulli

javascript生成器问题-解释此代码

  •  3
  • Homunculus Reticulli  · 技术社区  · 7 年前

    我正在读弗拉维奥斯科普斯的“javascript手册”。他介绍了发电机的概念。

    function* calculator(input) {
      var doubleThat = 2 * (yield(input / 2))
      var another = yield(doubleThat)
      return (input * doubleThat * another)
    }
    
    // He then runs the following code
    
    const calc = calculator(10)
    console.log(calc.next())

    产量

    {value: 5, done: false}

    calc.next(7);
    

    输出:

    {value: 14, done: false}

    我理解第一个输出,但不理解第二个输出。为什么输出是14?

    我的理解是下次 .next() 被调用 calc ,它应该继续在线 上次暂停的那个。

    好吧,这句台词是: var another = yield(doubleThat) 以及变量的值 doubleThat 此时应该是10,所以我希望第二个结果返回值为10的对象。

    我不认为书中的例子是一个很好的例子,因为我理解了生成器(Python)和Iterators(C++/Python)的概念,并且我理解了其他JavaScript生成器的例子——但是我根本不理解这里发生了什么。

    有谁能解释一下为什么 calc.next(7) 是14?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Pointy    7 年前

    呼唤 .next(7) 提供第一个值 yield 表达式,重写值 5 它先前计算并返回的。这是一种双向关系。第一 产量 “暂停”中间的表达,要清楚。执行从该表达式内部继续,而不是下一个语句。

    也就是说,我倾向于同意这是一个值得怀疑的例子,因为我不确定这是否是一个现实的情况。很难想象这样的代码是专门为某个实际应用程序构建的。

        2
  •  3
  •   Ced    7 年前
    function* calculator(input) {
      var doubleThat = 2 * (yield(input / 2))
      var another = yield(doubleThat)
      return (input * doubleThat * another)
    }
    
    const calc = calculator(10)
    console.log(calc.next()); 
    

    在这一点上,你达到了第一个收益率 10 / 2 .

    然后

    calc.next(7);
    

    代码现在是

    var doubleThat = 2 * (7) // yield expression transformed into 7
    

    因此价值是14

    您可以通过调试器获得一些信息

    function* calculator(input) {
      var doubleThat = 2 * (yield(input / 2))
      var another = yield(doubleThat)
      return (input * doubleThat * another)
    }
    
    const calc = calculator(10)
    debugger;
    console.log(calc.next()); 
    debugger;
    console.log(calc.next(7))
    

    唯一奇怪的是,当您进入下一个第二行时,调试器会让您进入函数的第二行,似乎没有执行 2*7 . 我想这似乎只是因为它没有停止表达,但我可能是错的。