2017-07-26 13 views
0

なぜbの最終値は24ではなく18ですか?
私は2ので、b12 * 2 = 24と同じである必要がありa12lastで、機能s2が前回呼び出されたときだと思います。javascriptジェネレータ関数について混乱しました

bar関数の最後の行で

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

b = a * (yield 2); 

コードはすでに(yield 2)を実行する前にa *を走りました。したがって、その時点ですでにaが評価されているように見えます。

あなたは(yield 2)後にaによる乗算を移動した場合、それは(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);

関連する問題