【问题标题】:Array of yield without comma不带逗号的产量数组
【发布时间】:2018-07-12 12:43:06
【问题描述】:

我正在研究javascript ES6的生成器

当我试图理解我的书的一个例子时,我遇到了麻烦,因为下面的代码中有一个没有逗号的 yield 数组

这段代码是如何工作的?

[代码]

let gen = function*(){
    return [yield yield]; // how this code line works?
}
let genObj = gen();
console.log(genObj.next());
console.log(genObj.next(10));
console.log(genObj.next(20));

[运行结果]

Object {value: undefined, done: false}
Object {value: 10, done: false}
Object {value: Array[1], done: true}

[测试 - 1]

let gen = function*(){
    return ['a' 'b'];
}
// Uncaught SyntaxError: Unexpected string

[测试 - 2]

let a = [yield yield]

// Uncaught SyntaxError: Unexpected identifier

【问题讨论】:

    标签: javascript ecmascript-6 generator


    【解决方案1】:

    您的代码相当于以下内容:

    let gen = function*(){
        let x = yield;
        let y = yield x;
        return [y];
    }
    let genObj = gen();
    console.log(genObj.next());
    console.log(genObj.next(10));
    console.log(genObj.next(20));

    [yield yield] 不是元素之间没有逗号的数组,它是单个元素的数组,表达式yield yield

    yield yield 首先评估右 yield。它没有参数,所以它从第一次调用.next() 时返回undefined。第二个.next()传入10,变成yield的结果值。

    这个10 被传递给第二个yield,显示为第二个.next() 调用的返回值。第三个.next()调用传入20,成为第二个yield的结果值。

    然后该函数将这个 20 包装在一个数组 [ ] 中并返回它。

    【讨论】:

      【解决方案2】:

      我只关注你的第一个例子:

      return [yield yield];
      

      这条线从右到左。最右边的yieldundefinedvalue 发送给iterator 的调用者(这就是genObj 的作用——一个迭代器)。在您调用genObj.next(10) 的那一行,您将10 传递给函数gen() 并在最右边的yield 处恢复执行,就好像yield 变成10

      return [yield 10];
      

      现在控制台记录10,因为那是下一个valueyield。然后你传入20,所以实际上函数恢复就像:

      return [20];
      

      所以记录的最后一个返回 value 是一个包含值 20length === 1 数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2022-10-13
        • 2015-04-11
        • 2023-04-07
        • 2012-04-15
        相关资源
        最近更新 更多