【发布时间】:2017-10-30 00:14:00
【问题描述】:
ES6生成器的next()传递参数时,为什么忽略第一个值?更具体地说,为什么这个输出说x = 44而不是x = 43:
function* foo() {
let i = 0;
var x = 1 + (yield "foo" + (++i));
console.log(`x = ${x}`);
}
fooer = foo();
console.log(fooer.next(42));
console.log(fooer.next(43));
// output:
// { value: 'foo1', done: false }
// x = 44
// { value: undefined, done: true }
我对这种生成器行为的心理模型是这样的:
- 返回
foo1并在yield 处暂停(并且返回foo1的next调用将42作为参数) - 暂停直到下次呼叫
next - 在下一次收益时,继续使用
var x = 1 + 42行,因为这是之前收到的参数 - 打印
x = 43 - 只需从最后一个
next返回一个{done: true},忽略其参数 (43) 并停止。
现在,显然,这不是正在发生的事情。所以... 我在这里做错了什么?
【问题讨论】:
-
调用
foo()直到第一个yield才执行,它只创建生成器对象。第一个next()调用从函数顶部开始执行,直到第一个yield- 并返回那里产生的值。
标签: javascript generator yield