《你不知道的javascript》[中篇] generator有关如下代码运行结果为啥是 12 18, 自己计算12 24

新手上路,请多包涵
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <link rel="stylesheet" href="">
</head>
<body>
<script  >

let a = 1;
let 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() {
        last = it.next(last).value
    }
}

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

s2();
s2();
s1();
s2();
s1();
s1();
s2();
console.log(a,b)
</script>
</body>
</html>
阅读 1.9k
2 个回答

重点应该是第四个调用,即第三个 s2()。这个时候恢复执行的位置是 a = 8 + b,得到 a9,然后在 b = 9 * (yield 2) 的时候又暂停,这个时候 a 应该就已经是 9。最后一步调用的时候计算的应该是 9 * 2

新手上路,请多包涵

image.png
感谢!搞懂了,yield再次启动拿上次停下的值计算

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进