Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript next()在生成器上的直接行为与在具有生成器值的变量上的行为不同_Javascript_Generator_Next - Fatal编程技术网

Javascript next()在生成器上的直接行为与在具有生成器值的变量上的行为不同

Javascript next()在生成器上的直接行为与在具有生成器值的变量上的行为不同,javascript,generator,next,Javascript,Generator,Next,为什么直接对生成器调用next()时得到的结果与对赋值为同一生成器的变量调用next()时得到的结果不同 所有代码/输出如下 以下是生成器以及变量声明/赋值: function* gen() { yield 1; yield 2; yield 3; }; let genVar = gen(); 第一个代码段: let first = genVar.next(); console.log(first); second = genVar.next(); console.log(sec

为什么直接对生成器调用next()时得到的结果与对赋值为同一生成器的变量调用next()时得到的结果不同

所有代码/输出如下

以下是生成器以及变量声明/赋值:

function* gen() {
  yield 1;
  yield 2;
  yield 3;
};

let genVar = gen();
第一个代码段:

let first = genVar.next();
console.log(first);
second = genVar.next();
console.log(second);  
{ value: 1, done: false }
{ value: 2, done: false }
let one = gen().next();
console.log(one);
two = gen().next();
console.log(two);
{ value: 1, done: false }
{ value: 1, done: false }
第一个代码段的输出:

let first = genVar.next();
console.log(first);
second = genVar.next();
console.log(second);  
{ value: 1, done: false }
{ value: 2, done: false }
let one = gen().next();
console.log(one);
two = gen().next();
console.log(two);
{ value: 1, done: false }
{ value: 1, done: false }
第二个代码段:

let first = genVar.next();
console.log(first);
second = genVar.next();
console.log(second);  
{ value: 1, done: false }
{ value: 2, done: false }
let one = gen().next();
console.log(one);
two = gen().next();
console.log(two);
{ value: 1, done: false }
{ value: 1, done: false }
第二个代码段的输出:

let first = genVar.next();
console.log(first);
second = genVar.next();
console.log(second);  
{ value: 1, done: false }
{ value: 2, done: false }
let one = gen().next();
console.log(one);
two = gen().next();
console.log(two);
{ value: 1, done: false }
{ value: 1, done: false }

目前我最好的猜测是,这与按值/引用赋值有关?

每当执行生成器函数时,都会创建一个全新的生成器对象,允许从一开始就迭代生成器函数的步骤


因此,在第二个示例中,您实际上创建了两个不同的迭代器。

不同之处不在于变量与调用表达式之间的差异,即
.next()
调用目标。简单地说,在第二个示例中,您调用了两次
gen()
,创建了两个不同的生成器对象。这种“允许在生成器上迭代的迭代器”的措辞令人困惑。生成器是迭代器。我已经稍微修改了我的答案,仍然试图保留生成器函数从一开始就被每个新的生成器对象迭代的想法,因为问题似乎暗示这可能不清楚。希望能更清楚一点,如果不清楚,请随时告诉我。