Javascript ES6生成器-第一个下一个()没有屈服表达式的示例
对于ES6发电机,为什么作者会说: 发件人: “下一次(…)的第一次呼叫,我们没有发送任何东西。为什么?因为没有屈服表达式来接收我们传递的内容。” 第一个Javascript ES6生成器-第一个下一个()没有屈服表达式的示例,javascript,ecmascript-6,ecmascript-harmony,Javascript,Ecmascript 6,Ecmascript Harmony,对于ES6发电机,为什么作者会说: 发件人: “下一次(…)的第一次呼叫,我们没有发送任何东西。为什么?因为没有屈服表达式来接收我们传递的内容。” 第一个it.next()调用(yield(x+1)) 您可以看到,我们仍然可以通过初始的foo(5)迭代器实例化调用传入参数(在我们的示例中是x),就像普通函数一样 下一个电话,我们什么也不发。为什么?因为没有屈服表达式来接受我们传递的东西 第一个it.next()对应于收益率(x+1),结果是6。下一次调用it中的12。next(12)将第一个收益
it.next()
调用(yield(x+1))
您可以看到,我们仍然可以通过初始的foo(5)迭代器实例化调用传入参数(在我们的示例中是x),就像普通函数一样
下一个电话,我们什么也不发。为什么?因为没有屈服表达式来接受我们传递的东西
第一个it.next()
对应于收益率(x+1)
,结果是6。下一次调用it中的12。next(12)
将第一个收益率的值设置为12,因此y
被设置为该值的两倍,或24,迭代器产生值(y/3)
,即8。最后调用it.next(13)
将第二个收益率的值设置为13,设置为z
,并接收返回值,即5+24+13
当然,由于语法的原因,它有点混乱
z = yield(y / 3)
从某种程度上看,这似乎是在将与y/3
有关的值赋给z
。事实并非如此y/3
是生成用作迭代器值的值,而z
被分配给后面的传递的值。next()
调用,完全不同!省略括号并将其写为
var y = 2 * yield x + 1;
var z = yield y / 3;
请记住,yield
是一个语句,而不是函数调用
至于您提到的错误,例如在traceur中,它是“发送值到新的生成器”。当你考虑它的时候,它是有意义的。作为参数发送给it.next()
的值将成为生成器中最近的产量的值。在第一次调用it.next()
时,生成器中没有最新的产量,因此传递的值没有任何内容,因此出现错误
不要混淆将参数传递给生成器(x
,在您的情况下),它只提供了一种配置或初始化生成器的方法,并将参数传递给it.next()
,作为生成器中最新的产量
的值
<> P>这可能有助于考虑如何编写等效的手摇发电机(简化为只返回下一个值,而不是<代码> {值,完成} /代码>,当发电机出气时抛掷):
然后:
iterator = foo(5);
iterator(); // 6
iterator(12); // 8
iterator(13); // 42
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