JavaScript的yield关键字的定义
在Javascript中,yield关键字用于暂停生成器函数的执行,yield关键字后面的表达式值被返回给生成器的调用者。这可以被认为是返回关键字的生成器版本。因此,这个关键字只能从生成器函数中直接调用。然而,这不能直接从回调或嵌套函数中调用。下面几节将讨论语法、工作和其他几个关于收益率关键字的细节。
语法:
下面是yield关键字的语法。
[var_name] = yield [expression]
参数:
- 表达式: 可选参数;必须通过迭代器协议从生成器函数返回的值。
- var_name: 可选参数;可选值被检索到,它被传递给生成器的next()方法以恢复执行。
- Yield导致调用生成器的next()方法返回一个IteratorResult对象,该对象有两个属性,如value和done。value属性表示yield表达式的评估结果,并表明生成器函数是否已经完全完成。Done是假的,意味着它没有完全完成。
Yield关键字在JavaScript中是如何工作的?
为了理解yield关键字是如何工作的,让我们看一个例子,其中有必须执行的步骤。
- 首先,为生成器函数创建一个对象。
const it = func(0);
这里,它是对象,而func是生成器函数。
- 用必须执行的代码定义生成器函数:
function* func(indx) {
// code that has to be performed. . .
}
- 使用console.log()方法打印基于生成器函数的结果,如下所示:
console.log(it.next().value);
注意: 如果yield表达式被暂停,生成器函数的执行将一直暂停,直到生成器的next()方法被调用。当生成器的next()方法被调用时,函数恢复执行并运行到任何一个条件被达到。
- 抛出有助于从生成器函数中抛出一个异常。执行会因此而停止。
- 当生成器函数到达终点时,生成器函数执行结束,并向调用者返回一个IteratorResult。
JavaScript收益率的例子
让我们看看一些关于yield关键字的示例程序。
例子#1
JavaScript程序有一个生成器函数,检查索引值是否为4,并打印出相应的结果。
代码
function* func(indx) {
while (indx <4) {
yield indx;
indx++;
}
}
const it = func(0);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
输出

在这个程序中,为生成器函数func创建了一个对象。然后,函数被调用,并检查第一个值是否小于4。由于第一个值是0,它被传递给函数,所以首先返回0。然后索引值被递增,并根据console.log()函数的数量打印结果。一个额外的console.log()函数,未定义的,也会被打印出来。为了避免这种情况,可以删除一个console.log()函数,如下图所示。
function* func(indx) {
while (indx <4) {
yield indx;
indx++;
}
}
const it = func(0);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
在执行该代码时,输出变化如下。可以看出,上述结果中的undefined在这里并没有出现。

例子#2
JavaScript程序有一个生成器函数,通过检查列表的长度来打印列表中的元素。
代码
function* count () {
let samplelist = [5, 9, 10]
for (let i = 0; i < samplelist.length; i++) {
yield samplelist[i]
}
}
let colg = count() // call generator fuction
console.log(colg.next())
console.log(colg.next())
console.log(colg.next())
console.log(colg.next())
输出

在这个程序中可以为生成器函数count创建一个对象。然后,调用该函数,创建一个包含三个数字的列表。然后检查列表的长度,并打印列表中的每个元素。由于有一个额外的console.log()函数,未定义的也被打印出来。为了避免这种情况,可以删除一个 console.log() 函数。正如在上面的章节中提到的,yield导致调用生成器的next()方法返回一个IteratorResult对象,该对象有两个属性,如value和done。在这里,值是数字,假的是执行未完成。
例子#3
有两个打印元素的生成器函数的JavaScript程序。
代码
function* func2() {
yield8;
yield7;
yield4;
}
function* func1() {
yield6;
yield* func2();
yield10;
}
const it = func1(0);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
输出

在这个程序中,为生成器函数func1创建了一个对象。这里,有两个函数,func1和func2。首先,函数func1被调用,由于第一个元素是6,它首先被打印出来。然后,在func1里面,func2被调用,接下来打印的元素将来自func2。最后,在完成func2中的所有元素后,func1中的其余元素被打印出来,如示例输出中所示。
例子 #4
这个JavaScript程序有一个生成器函数,从列表和参数中打印元素。
代码
function* func1() {
yield* [78, 22];
yield* '56';
yield* Array.from(arguments);
}
const it = func1(12, 34);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
console.log(it.next().value);
输出

在这个程序中,我们为生成器函数func创建了一个对象。然后,该函数被调用,列表中的元素被打印出来。接下来,值56被分割成5和6。正如你所看到的,下一个元素是从参数中提取的。这里传递的参数是12和34。因此,所有这些元素都按照这个顺序被打印出来。
结论
屈服关键字有助于暂停生成器函数的执行,屈服关键字后面的表达式值会返回给生成器的调用者。本文详细解释了yield关键字的语法、工作原理和其他几个方面。