gpt4 book ai didi

javascript - ES6 生成器 - 第一个 next() 没有 yield 表达式的示例

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

对于ES6生成器,为什么this blog post的作者说:

来自:http://davidwalsh.name/es6-generators

"The first next(..) call, we don't send in anything. Why? Because there's no yield expression to receive what we pass in."

第一个 it.next() 不是调用 (yield (x + 1)) 吗?

function *foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}

var it = foo( 5 );

// note: not sending anything into `next()` here
console.log( it.next() ); // { value:6, done:false }
console.log( it.next( 12 ) ); // { value:8, done:false }
console.log( it.next( 13 ) ); // { value:42, done:true }

You can see that we can still pass in parameters (x in our example) with the initial foo( 5 ) iterator-instantiation call, just like with normal functions.

The first next(..) call, we don't send in anything. Why? Because there's no yield expression to receive what we pass in.

最佳答案

第一个 it.next() 对应于 yield(x + 1),结果如预期的那样为 6。下一次调用 it.next(12) 时的 12 将第一个 yield 的值设置为 12,因此 y 设置为它的两倍,即 24 和迭代器结果值 (y/3),即 8。对 it.next(13) 的最终调用将第二个 yield 的值设置为 13,即设置为 z,并接收 return 的值,即 5 + 24 + 13。

当然,由于语法原因,它有点令人困惑

z = yield(y / 3)

这看起来像是将与 y/3 相关的值分配给 z。事实并非如此。 y/3 是作为迭代器值产生的值,而 z 被分配给由以下 it.next() 调用,完全不同的东西!省略括号并将其写为

可能会有点帮助
var y = 2 * yield x + 1;
var z = yield y / 3;

请记住,yield 是一个语句,而不是函数调用。

至于您提到的错误,例如在 traceur 中它是“将值发送给新生生成器”。当您考虑它时,这是有道理的。作为参数发送到 it.next() 的值成为生成器中最近 yield 的值。在第一次调用 it.next() 时,生成器中 没有最新的 yield ,因此没有任何东西可以接受传递的值,因此出现错误。

不要混淆将参数传递给生成器(在您的情况下为 x),它仅提供一种配置或初始化生成器的方法,将参数传递给 it.next() ,作为生成器中最近的 yield 的值。

考虑如何编写等效的手动生成器可能会有所帮助(简化为仅返回下一个值而不是 {value, done},并在生成器结束时抛出气体):

function foo(x) {
var y, z, step = 0;
return function next(val) {
switch (step++) {
case 0: return x + 1; break;
case 1: y = 2 * val; return y / 3; break;
case 2: z = val; return x + y + z; break;
default: throw "generator finished";
}
};
}

然后:

iterator = foo(5);
iterator(); // 6
iterator(12); // 8
iterator(13); // 42

关于javascript - ES6 生成器 - 第一个 next() 没有 yield 表达式的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695346/

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