ES6 生成器
来源:互联网 发布:万方数据库与知网比较 编辑:程序博客网 时间:2024/05/18 14:24
本文内容主要来自《深入浅出ES6》
ES6生成器不是指生成ES代码的机器。
示例代码:
先看一段示例:
function* quips(name) { yield "你好 " + name + "!"; yield "希望你能喜欢这篇介绍 ES6 的译文"; if (name.startsWith("X")) { yield "你的名字 " + name + " 首字母是 X,这很酷!"; } yield "我们下次再见!"; }
生成器函数和普通函数的区别
这段代码看起来很像一个函数,我们称之为生成器函数,它与普通函数有很多共同点,但是二者有如下区别:
- 普通函数使用 function 声明,而生成器函数使用 function*声明。
- 在生成器函数内部,有一种类似 return 的语法:关键字 yield。
二者的区别是,普通函数只可以 return 一次,而生成器函数可以 yield 多次(当然也可以只 yield 一次)。 在生成器的执行过程中,遇到 yield 表达式立即暂停,后续可恢复执行状态。
这就是普通函数和生成器函数之间最大的区别,普通函数不能自暂停,生成器函数 可以。
生成器函数的执行
上面那段函数的执行:
> var iter = quips("jorendorff"); [object Generator]> iter.next(){ value: "你好 jorendorff!", done: false }> iter.next(){ value: "希望你能喜欢这篇介绍 ES6 的译文", done: false }> iter.next(){ value: "我们下次再见!", done: false } > iter.next() { value: undefined, done: true }
你大概已经习惯了普通函数的使用方式,当你调用它们时,它们立即开始运行,直 到遇到 return 或抛出异常时才退出执行。
生成器调用看起来非常类似:quips("jorendorff")。但是,当你调用一个生成器时,它并非立即执行,而是返回一个已暂停的生成器对象(上述实例代码中的 iter)。你可 将这个生成器对象视为一次函数调用,只不过立即冻结了,它恰好在生成器函数的最顶 端的第一行代码之前冻结了。
每当你调用生成器对象的.next()方法时,函数调用将其自身解冻并一直运行到下一 个 yield 表达式,再次暂停。
这也是在上述代码中我们每次都调用 iter.next()的原因,我们获得了 quips()函数体 中 yield 表达式生成的不同的字符串值。
调用最后一个 iter.next()时,我们最终抵达生成器函数的末尾,所以返回结果中 done 的值为 true。抵达函数的末尾意味着没有返回值,所以返回结果中 value 的值为 undefined。
如果用专业术语
- ES6 生成器
- ES6 中的生成器函数介绍
- 初步探究ES6之生成器
- ES6之生成器(Generator)
- JavaScript -- ES6 迭代器和生成器
- ES6学习——生成器(Generators):生成器+迭代器
- ES6学习——生成器(Generators):生成器+Promises
- ES6学习——生成器(Generators):生成器应用示例
- ES6学习——生成器(Generators):生成器高级应用
- 深入浅出ES6(三):生成器 Generators
- 深入浅出ES6(十一):生成器 Generators,续篇
- ES6(三) Generator (生成器)函数
- 深入浅出ES6(三):生成器 Generators
- 深入浅出ES6(十一):生成器 Generators,续篇
- 轻松学会ES6新特性之生成器
- 深入浅出ES6(三):生成器 Generators
- ES6学习笔记:迭代器与生成器
- ES6中的迭代器(Iterator)和生成器(Generator)
- 为何ViewController释放后不走dealloc
- Java内存模型与线程
- Java 多线程问题例子
- 【完全版】线段树
- opencl 插值取样的一个代码
- ES6 生成器
- POJ NO.2718 Smallest Difference(DFS)
- 杭电题库刷题记录2011
- 如何在网页上生成验证码?
- Android性能优化总结
- Kafka实战-KafkaOffsetMonitor
- 大学生 一带一路
- OJ 之常规练习题(三)
- ViewController生命周期详解