The memoized version does not even remotely work.
a = fib(5);
for (i = 0; i < 7; ++i) console.log(a.next());
gives the expected Object {value: 0, done: false}
Object {value: 1, done: false}
Object {value: 1, done: false}
Object {value: 2, done: false}
Object {value: 3, done: false}
Object {value: undefined, done: true}
Object {value: undefined, done: true}
But then b = fib(3)
for (i = 0; i < 5; ++i) console.log(b.next());
gives the completely wrong: Object {value: 1, done: false}
Object {value: 0, done: false}
Object {value: 1, done: false}
Object {value: 1, done: false}
Object {value: undefined, done: true}