Я читал this article about javascript generators, и я достиг следующий фрагмент:Почему этот итератор возвращает следующие значения?
function *foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y/3);
return (x + y + z);
}
var it = foo(5);
// note: not sending anything into `next()` here
console.log(it.next()); // { value:6, done:false }
console.log(it.next(12)); // { value:8, done:false }
console.log(it.next(13)); // { value:42, done:true }
Я не понимаю, цель первого it.next()
. После выполнения этой строки эта строка не должна останавливаться итератором на var z = yield (y/3)
, причем y имеет значение 6? Не должно it.next(12)
указать параметр для yield (y/3)
, а z после этого 4? Я не понимаю, почему результат функции не равен 5 + 12 + 4. Это как-то так, как если бы первый it.next()
был проигнорирован. Это так? Может кто-то пролить свет?
ли я это правильно понял? В принципе, после вызова первого 'it.next()', 6 возвращается вызывающему, а узел приостанавливает функцию на том же выходе? Таким образом, при вызове 'it.next (12)' он использует 12 вместо x + 1, правильно? – Geo
@Geo: Именно так работает 'yield', да :-) В большинстве случаев (например, итераторы) вам не нужны значения, которые передаются (или вообще не передаются значения), но вы можете сделать некоторые причудливые вещи с этим. Пойдите, прочитайте в серии статей, которые вы связали в своем вопросе! – Bergi