gpt4 book ai didi

javascript - ES6 生成器 : First call to next()

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:12:21 25 4
gpt4 key购买 nike

我试图了解如何使用 ES6 生成器函数。除了关于在传递参数时进行空的 next() 函数调用这一概念外,它看起来非常简单。这是我从 Mozilla 文档中引用的代码。

function* logGenerator() {
console.log(yield);
console.log(yield);
console.log(yield);
}

var gen = logGenerator();

// the first call of next executes from the start of the function
// until the first yield statement

gen.next();
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaise

据我所知,代码只执行到第一个 yield 语句,所以没有返回任何内容,然后我们第二次调用 next(),代码执行到第二个 yield,这包括第一条让行线,因此 pretzel 被记录到控制台。

如果是这种情况,在下面提到的代码中 0 是如何在第一次调用 next() 时被记录的?我在这里遗漏了一些东西:(

function* idMaker() {
var index = 0;
while (index < 3)
yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined

引用:Mozilla Documentation

最佳答案

嗯,生成器函数有点特殊。它们可以在整个执行过程中多次接受和返回值,而“普通”函数只能接受一组固定的参数,并返回一个值。在您的第一个示例中,它们用于将数据传递给生成器(多次传递参数),而在第二个示例中则相反(多次返回值)。

考虑这个例子:

function* foo() {
console.log("before a");

var a = (yield 123);

console.log("after a");

yield (a * 2);

console.log("end of function");
}

var bar = foo();

var x = bar.next(); // Runs until the first yield, prints 'before a'.
console.log(x.value); // 123
var y = bar.next(4); // Runs until the second yield, so prints 'after a'.
console.log(y.value); // 8
var z = bar.next(); // prints 'end of function'.
console.log(z.done); // true

我们在第一个 next() 调用中不传递任何数据,让它一直运行到第一个 yield 语句。因为 yield 123,调用的结果 (x.value) 是 123。下次我们使用 调用 next() 4 作为参数值,我们在生成器函数中填充局部变量a。代码一直执行到下一个yield语句,返回8的结果。

关于为什么0而不是1的解释,参见其他答案。

关于javascript - ES6 生成器 : First call to next(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39732697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com