JavaScript的yield关键字介绍及应用实例

589 阅读5分钟

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);

输出

JavaScript Yield-1.1

在这个程序中,为生成器函数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在这里并没有出现。

JavaScript Yield-1.2

例子#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())

输出

Output-1.3

在这个程序中可以为生成器函数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);

输出

Output-1.4

在这个程序中,为生成器函数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);

输出

Output-1.5

在这个程序中,我们为生成器函数func创建了一个对象。然后,该函数被调用,列表中的元素被打印出来。接下来,值56被分割成5和6。正如你所看到的,下一个元素是从参数中提取的。这里传递的参数是12和34。因此,所有这些元素都按照这个顺序被打印出来。

结论

屈服关键字有助于暂停生成器函数的执行,屈服关键字后面的表达式值会返回给生成器的调用者。本文详细解释了yield关键字的语法、工作原理和其他几个方面。