gpt4 book ai didi

javascript - js 生成器函数中的第一个 next() 是否总是执行到第一个 yield?

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

MDN建议“当迭代器的 next() 方法被调用时,生成器函数的主体被执行直到第一个 yield 表达式”,我理解这个例子:

function* logGenerator() {
console.log(0);
console.log(1, yield);
console.log(2, yield);
console.log(3, yield);
}

var gen = logGenerator();

gen.next(); // 0
gen.next('pretzel'); // 1 pretzel
gen.next('california'); // 2 california
gen.next('mayonnaise'); // 3 mayonnaise

然而,当我遇到另一个例子时,我感到困惑:

const foo = function*() {
yield 10;
yield 20;
};

const bar = foo();
console.log(bar.next()); // {value: 10, done: false}

如果第一个 next() 仅在第一个 yield BEFORE 之前执行代码,则该值应该是未定义的。它如何在第一次 yield WITHIN中获取值(value)?我在这里有点困惑。感谢您的帮助。

最佳答案

您可以通过记录生成器每次生成的内容以及向 yield 添加值来更好地了解发生了什么。表达式,这样您就可以看到生成器实际产生了什么(MDN 示例没有理会这个,因为它从不使用产生的值,它只是演示了 next() 参数的工作方式)。

通常,您不会使用单个生成器来生成值,也不会通过 next() 接收值。争论,只是一个或另一个。如果它产生值,您将使用 yield <expression>作为一个单独的语句(类似于 return ),通常不在表达式中。如果它收到您使用的值 yield表达式中没有参数。但是正如您在我的修改示例中看到的那样,底层机制同时允许两者。您只需要跟踪困惑的执行顺序。

function* logGenerator() {
console.log(0);
console.log(1, yield 10);
console.log(2, yield 20);
console.log(3, yield 30);
}

var gen = logGenerator();

console.log("call 1 yielded", gen.next().value); // 0
console.log("call 2 yielded", gen.next('pretzel').value); // 1 pretzel
console.log("call 3 yielded", gen.next('california').value); // 2 california
console.log("call 4 yielded", gen.next('mayonnaise').value); // 3 mayonnaise

第一次调用生成器是执行console.log(0);然后开始执行 console.log(1, yield 10) .但是当它到达 yield 时表达式,next()返回该值,实际调用 console.log() 之前.

下次您调用生成器时,它会从中断处继续,即构建 console.log() 的参数。 . yield 10表达式被替换为 next() 的参数, 所以它执行 console.log(1, 'pretzel') .

然后开始执行console.log(2, yield 20) ,同样的事情发生了——它产生 20打电话前console.log() .

MDN 试图展示的是 next() 的参数仅在第二次调用时才有意义,因为它替换了 yield 的值在生成器恢复时中断的表达式中。在第一次调用时使用参数无效,因为没有要替换的中断表达式。

关于javascript - js 生成器函数中的第一个 next() 是否总是执行到第一个 yield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52826489/

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