假设我具有以下功能:
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}
答案 0 :(得分:3)
表达式的值:
x += yield x + 1;
不是 x + 1
。值x + 1
是产生给调用方的值。生成器中yield
的值就是传递的值。在这种情况下,它始终为1
,因为这是通过以下方式传递给它的:
world.next(1)
发电机一旦碰到yield
,就会立即停止运行,因此在这种情况下
x += yield x + 1;
您可以认为它的工作方式如下:
yield x + 1; // pass this value to the called
[Pause]
[Next call from world.next(1)]
x = 1 // value passed in from caller