【发布时间】:2019-10-12 13:17:08
【问题描述】:
假设我有一些功能如下:
function *hello(x) { // define generator
while (x < 7) {
console.log(`before: ${x}`)
x += yield x + 1; // generator object will have value x + 1, then next step of generator has value x + x and not x + x + 1
console.log(`after: ${x}`)
}
return x;
}
var world = hello(3);
console.log( world.next(2) );
console.log( world.next(2) );
console.log( world.next(2) );
console.log( world.next(2) );
// before: 3
// {value: 4, done: false}
// after: 5
// before: 5
// {value: 6, done: false}
// after: 7
// {value: 7, done: true}
// {value: undefined, done: true}
我可以看到带有yield的行返回了一个值为x + 1的生成器对象,但x的实际值只增加了x,而不是x+1,可以这样通过before 和after 控制台日志中的值看到。为什么x 的值在yield 的右侧被添加到x 的当前值,而+ 1 不是?我知道x 的值是要添加的,因为如果我在next 函数中更改传递给生成器对象的值,则之前和之后的值反映了x 增加了多少。
function *hello(x) { // define generator
while (x < 7) {
console.log(`before: ${x}`)
x += yield x + 1; // generator object will have value x + 1, then next step of generator has value x + x and not x + x + 1
console.log(`after: ${x}`)
}
return x;
}
var world = hello(3);
console.log( world.next(1) );
console.log( world.next(1) );
console.log( world.next(1) );
console.log( world.next(1) );
// before: 3
// {value: 4, done: false}
// after: 4
// before: 4
// {value: 5, done: false}
// after: 5
// before: 5
// {value: 6, done: false}
// after: 6
// before: 6
// {value: 7, done: false}
// after: 7
// {value: 7, done: true}
// {value: undefined, done: true}
【问题讨论】:
标签: javascript ecmascript-6 generator