Код в первом посте range(0, 10) создаёт массив чисел, а затем, при суммировании, на нём (на массиве) запускается итератор массива.
В №7 range(0, 10) создаёт итератор, который запускается при суммировании.
Ещё пример, добавлю функцию
function* take(n, xs) {
for(const x of xs) {
if(n-- <= 0)
break;
yield x;
}
}
Теперь, если использовать определения из №1, то
alert(sum(take(5, range(1, Infinity)))); никогда ничего не вернёт, поскольку сначала попытается создать массив из всех натуральных чисел! (я в курсе про Number.MAX_SAFE_INTEGER)
Теперь, если использовать определения из №7, то
alert(sum(take(5, range(1, Infinity)))); результат будет, поскольку оно просуммирует столько чисел, сколько указано!