作者:平凡天使007 | 来源:互联网 | 2024-11-18 16:33
在 Javascript 中,生成器函数(Generator Function)通过使用 yield
关键字来实现异步编程。生成器函数允许你在函数执行过程中暂停,并在需要时恢复执行。下面是一个示例代码,展示了生成器函数的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| function step(gen) { var it = gen(); var last;
return function () { last = it.next(last).value; } }
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; console.log("这个时候的a", a); //9 b = a * (yield 2); }
// 确保重新设置a和b a = 1; b = 2;
var s1 = step(foo); var s2 = step(bar);
// s2 和 s1 的返回是独立的 s2(); s2(); s1(); s2(); s1(); s1(); // 倒数第二步
console.log('最后一步之前a', a, 'b', b); s2(); // 最后一步 console.log('a', a, 'b', b); |
我的疑惑是,在倒数第二步时,全局变量 a
已经被修改为 12。然而,在执行最后一步 s2()
时,b = a * (yield 2)
这个表达式的左边部分按逻辑应该是 b = a * 2
。为什么最终 b
的值变成了 18?执行最后一步 s2()
时,a
的值仍然是 9?
原因在于生成器函数的执行过程。当调用 it.next(value)
时,传入的 value
会被赋值给 yield
表达式的左侧。在最后一次调用 s2()
时,yield 2
返回的是 2,而 a
在此之前已经通过 (yield 8) + b
被修改为 9。因此,b = 9 * 2
,最终 b
的值为 18。