Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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 ES6生成器-第一个下一个()没有屈服表达式的示例_Javascript_Ecmascript 6_Ecmascript Harmony - Fatal编程技术网

Javascript 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)将第一个收益

对于ES6发电机,为什么作者会说:

发件人:

“下一次(…)的第一次呼叫,我们没有发送任何东西。为什么?因为没有屈服表达式来接收我们传递的内容。”

第一个
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