对javascript生成器功能感到困惑

时间:2017-07-26 03:12:53

标签: javascript

为什么最终b的值不是24而是18? 我认为上次调用函数s2时,a12last2,因此b应等于{ {1}}。



12 * 2 = 24




1 个答案:

答案 0 :(得分:0)

bar函数的最后一行:

b = a * (yield 2);

代码在运行a *之前已经运行了(yield 2)。因此,a似乎已经在此时进行了评估。

如果您将乘法移动a(yield 2)之后,那么在a运行后似乎会(yield 2)进行评估,从而确保您获得最新信息价值a

因此bar函数的最后一行可能变为:

b = (yield 2) * a;

这可以在下面的例子中看到。

let a = 1, b = 2;

function* foo() {
  a++;
  yield;
  b = b * a;
  a = (yield b) + 3;
}

function* bar() {
  b--;
  yield;
  a = (yield 8) + b;
  b = (yield 2) * a;
}

function step(gen) {
  let it = gen();
  let last;

  return function () {
    last = it.next(last).value;
  };
}

let s1 = step(foo);
let s2 = step(bar);

s2(); //b=1 last=undefined

s2(); //last=8

s1(); //a=2 last=undefined

s2(); //a=9 last=2

s1(); //b=9 last=9

s1(); //a=12

s2(); //b=24

console.log(a, b);