关于(不知道的js中 yield的问题)

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)这个表达式除了yiled 2 左边的部分,按逻辑上应该是b = a2;
为啥b最后返回了一个18????。。。执行最后一步s2的时候,a的值还是9?

阅读 2.9k
2 个回答

加了两句输出
明显可以看到 “a到底是几==”这个输出在 “a最后赋值=======” 之前
函数停止之前a已经获取到值了

function* foo() {
    a++;
    yield;
    b = b * a;
    a = (yield b) + 3;
    console.log("a最后赋值=======",a)//在这里 a在s1中最后赋值
}
function* bar() {
    b--;
    yield;
    a = (yield 8) + b;
    console.log("这个时候的a", a); //9
    b = console.log("a到底是几==",a) * (yield 2);//因为程序运行到*这里的时候停止了所有此时a已经获取到值了
    //假如写成下面这样
    //b = (yield 2)*a;结果就不一样了 同样函数在*这里停止 重新运行之后a才获取
}

不要再纠结yield,使用async await。

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