Я попробую:
const c = cache();
console.log("Return value: "+ c.next("this is lost").value);
Это присваивает c
с функцией итератора для cache
(первая строка), а затем сначала запускает cache
до первого yield expression
Таким образом, в основном этот код:
let input, output, cache = {};
yield output;
output
равен undefined
, поэтому undefined
возвращается из первого next()
вызова. Однако обратите внимание, что аргумент ("this is lost"
) не , переданный в этот yield
. Он будет передан в yield
, где предыдущее выполнение было остановлено. Поскольку не было предыдущего запуска c.next
, он действительно потерян.
При следующем запуске:
console.log("Return value: "+ c.next("Hello").value);
выполняется следующий код:
input = "Hello"; // the yield is substituted with the next() argument here!
//Some code...
if(input in cache){ // false
output = cache[input];
console.log("Old Value: "+output);
} else {
output = f(input);
cache[input] = output;
console.log("New Value: "+output);
}
yield output // "olleH"
Функция возобновляется с той же строки, на которой она была остановлена ранее, и yield output
заменяется аргументом next()
. MDN говорит:
Вызов метода next () с аргументом возобновит выполнение функции генератора, заменив выражение yield, где выполнение было приостановлено, аргументом из next ().