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

答案 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);