Generator 函数是 ES6 中引入的一种新的函数类型,它可以通过 yield 关键字来实现函数的暂停和恢复,可以用于异步编程、迭代器等多种场景。在 ES7 中,Generator 函数又新增了一些新的特性,本文将详细介绍这些特性,并给出示例代码。
Generator 函数的基本使用
我们先来回顾一下 Generator 函数的基本使用方法。Generator 函数可以通过 function* 关键字来定义,例如:
function* myGenerator() { yield 1; yield 2; yield 3; }
在函数内部,我们可以使用 yield 关键字来暂停函数的执行并返回一个值,例如上面的代码中,myGenerator 函数会返回一个迭代器对象,每次调用迭代器的 next 方法就会返回一个值。我们可以用 for...of 循环来遍历这个迭代器:
for (let value of myGenerator()) { console.log(value); // 1 2 3 }
Generator 函数的新特性
1. Generator 函数的返回值
在 ES7 中,Generator 函数的返回值可以通过 return 关键字来指定。当调用 return 方法时,Generator 函数会立即结束,并返回指定的值。例如:
// javascriptcn.com 代码示例 function* myGenerator() { yield 1; yield 2; return 3; } let iterator = myGenerator(); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: true } console.log(iterator.next()); // { value: undefined, done: true }
可以看到,调用 return 方法后,Generator 函数会返回指定的值,并将 done 属性设置为 true,表示迭代器已经结束。在调用 return 方法后,再调用 next 方法会返回 { value: undefined, done: true }。
2. Generator 函数的 throw 方法
Generator 函数的 throw 方法可以在函数内部抛出一个异常,例如:
// javascriptcn.com 代码示例 function* myGenerator() { try { yield 1; yield 2; } catch (e) { console.log(e.message); } } let iterator = myGenerator(); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.throw(new Error('Something went wrong'))); // Error: Something went wrong console.log(iterator.next()); // { value: undefined, done: true }
在上面的代码中,我们调用了 iterator.throw 方法来抛出一个异常,并在 Generator 函数内部使用 try...catch 语句来捕获异常并处理。
3. Generator 函数的 delegation
Generator 函数的 delegation 可以将一个 Generator 函数的执行委托给另一个 Generator 函数,例如:
// javascriptcn.com 代码示例 function* subGenerator() { yield 2; yield 3; } function* myGenerator() { yield 1; yield* subGenerator(); yield 4; } let iterator = myGenerator(); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: 4, done: false } console.log(iterator.next()); // { value: undefined, done: true }
在上面的代码中,我们使用 yield* 关键字来将 subGenerator 的执行委托给 myGenerator。可以看到,subGenerator 返回的值会依次插入到 myGenerator 返回的迭代器中。
总结
Generator 函数是一种非常强大的函数类型,可以用于异步编程、迭代器等多种场景。在 ES7 中,Generator 函数又新增了一些非常实用的特性,例如返回值、throw 方法、delegation 等。我们可以根据具体的需求来选择使用这些特性,以提高代码的简洁性和可读性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657ab557d2f5e1655d527690