ES6生成器:首先调用next()

Sat*_*rao 3 javascript ecmascript-6

我试图了解如何使用ES6 Generator功能.除了这个关于在传递参数时进行空的next()函数调用的概念时,它似乎非常简单.这是我从Mozilla文档中引用的代码.

function* logGenerator() {
  console.log(yield);
  console.log(yield);
  console.log(yield);
}

var gen = logGenerator();

// the first call of next executes from the start of the function
// until the first yield statement

gen.next();
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaise
Run Code Online (Sandbox Code Playgroud)

根据我的理解,代码只执行到第一个yield语句,所以没有返回任何内容,然后第二次调用next(),代码执行到第二个yield,包括第一个yield行,因此pretzel记录到控制台.

如果是这种情况,在下面提到的代码中如何0登录第一次呼叫next()?我在这里遗漏了一些东西:(

function* idMaker() {
  var index = 0;
  while (index < 3)
    yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined
Run Code Online (Sandbox Code Playgroud)

参考:Mozilla文档

Car*_*iel 6

那么,发电机功能有点特殊.它们可以在执行过程中多次接受和返回值,而"普通"函数只能接受一组固定的参数,并返回单个值.在您的第一个示例中,它们用于将数据传递给生成器(多次传递参数),而在第二个示例中则反过来(多次返回值).

考虑这个例子:

function* foo() {
    console.log("before a");

    var a = (yield 123);

    console.log("after a");

    yield (a * 2);

    console.log("end of function");
}

var bar = foo();

var x = bar.next(); // Runs until the first yield, prints 'before a'.
console.log(x.value); // 123
var y = bar.next(4); // Runs until the second yield, so prints 'after a'. 
console.log(y.value); // 8
var z = bar.next(); // prints 'end of function'.
console.log(z.done); // true
Run Code Online (Sandbox Code Playgroud)

我们在第一次next()调用时没有传入数据,让它一直运行到第一个yield语句.由于yield 123call(x.value)的结果是123.下次我们调用next()using 4作为参数值时,我们在a生成器函数内填充局部变量.代码执行到下一个yield语句并返回结果8.

为了解释为什么0而不是1,请参阅另一个答案.


mwc*_*wcz 5

我认为您遇到的是后增量运算符的行为,即index++. 如果您将其更改为预自增运算符,即++index,它将按照您期望的方式运行。

不同之处在于,后自增会在表达式求值index 加 1 。index预自增会在表达式求值之前加 1 ,我认为这是你的目标。