2017-07-26 46 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);