You Don't Know JS 介绍 Generator 的第四章 里有一个练习:
var a = 1;
var b = 2;
function *foo() {
a++;
yield;
b = b * a;
a = (yield b) + 3;
}
function *bar() {
b--;
yield;
a = (yield 8) + b;
b = a * (yield 2);
}
function step(gen) {
var it = gen();
var last;
return function() {
// whatever is `yield`ed out, just
// send it right back in the next time!
last = it.next( last ).value;
};
}
var s1 = step( foo );
var s2 = step( bar );
s2(); // b--;
s2(); // yield 8
s1(); // a++;
s2(); // a = 8 + b;
// yield 2
s1(); // b = b * a;
// yield b
s1(); // a = b + 3;
s2(); // b = a * 2;
最后运行的结果是,
console.log( a, b ); // 12 18
请问这个最后的 b
为什么是 18
而不是 24
?
我自己先算了一遍,然后在 Chrome Console 里运行了一遍,每一步运行后 a
、b
的结果都是正确的,只有最后一步的 b
不正确。
我自己计算的是:最后一步的 s2()
之前,a = 12, b = 9
;(根据 console 运行的结果,到这里都是正确的)而最后一步 s2()
所做的就是把 a
的值(12
)乘以 2
(2*12 = 24
) 赋值给 b
,因此得到 b
最后的结果是 24
。
正确答案是 18
我实在不理解。各位有何高见?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.