2017-07-26 44 views
0

的困惑为什么最终的b的值不是24而是18?
我认为,当功能s2被称为最后一次,a12last2,所以b应等于12 * 2 = 24关于javascript生成器函数

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 = a * (yield 2); 
 
} 
 

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

回答

0

bar函数的最后一行:

b = a * (yield 2); 

代码已经运行(yield 2)前跑a *。所以看起来a已经被评估过了。

如果通过a移动乘法(yield 2)后的话,好像是运行(yield 2)a评估,从而确保您得到最高达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);