我有一段代码:
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 }
如您所见, firstnext()
不仅执行了 first 之前的语句yield
,还执行了第一yield
条语句。所以这个理论无法解释我的问题。谁能帮我指出正确的方向?提前致谢。