我有一段代码:
function * input(){
let array = [];
while(true) {
array.push(yield array);
}
}
var gen = input();
console.log(gen.next("A"))
console.log(gen.next("B"))
console.log(gen.next("C"))
console.log(gen.next("D"))
当您运行它时,您将获得以下输出:
{ value: [], done: false }
{ value: [ 'B' ], done: false }
{ value: [ 'B', 'C' ], done: false }
{ value: [ 'B', 'C', 'D' ], done: false }
为什么结果的第一行不包括数组中的
A
?
有一个解释来自于这个页面:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*#Passing_arguments_into_Generators。评论中写到:
第一次调用next()从函数的开始一直执行到第一个yield语句。
但是从我的测试来看,这个解释似乎不正确。我的测试代码如下:
function* logGenerator() {
console.log("before yield in function");
yield 1;
console.log("filler 1");
yield 2;
console.log("filler 2");
yield 3;
console.log("filler 3");
}
var gen = logGenerator();
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
结果是:
before yield in function
{ value: 1, done: false }
-----------------
filler 1
{ value: 2, done: false }
-----------------
filler 2
{ value: 3, done: false }
-----------------
filler 3
{ value: undefined, done: true }
正如你所看到的,第一个
next()
不仅执行了第一个yield
之前的语句,还执行了第一个yield
语句。因此,这个理论不能解释我的问题。有人能帮我指出正确的方向吗?提前致谢。
console.log(gen.next());
将会得到预期的输出。 - D. Walsh