From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../reference/global_objects/generator/index.html | 142 +++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 files/zh-cn/web/javascript/reference/global_objects/generator/index.html (limited to 'files/zh-cn/web/javascript/reference/global_objects/generator/index.html') diff --git a/files/zh-cn/web/javascript/reference/global_objects/generator/index.html b/files/zh-cn/web/javascript/reference/global_objects/generator/index.html new file mode 100644 index 0000000000..612024ca88 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/generator/index.html @@ -0,0 +1,142 @@ +--- +title: Generator +slug: Web/JavaScript/Reference/Global_Objects/Generator +tags: + - ECMAScript 2015 + - Generator + - JavaScript + - Legacy Generator + - Legacy Iterator + - 参考 + - 生成器 +translation_of: Web/JavaScript/Reference/Global_Objects/Generator +--- +
{{JSRef}} 
+ +

生成器对象是由一个 {{jsxref("Statements/function*", "generator function", "", 1)}} 返回的,并且它符合可迭代协议迭代器协议

+ +

语法

+ +
function* gen() {
+  yield 1;
+  yield 2;
+  yield 3;
+}
+
+let g = gen();
+// "Generator { }"
+ +

方法

+ +
+
{{jsxref("Generator.prototype.next()")}}
+
返回一个由 {{jsxref("Operators/yield", "yield")}}表达式生成的值。
+
{{jsxref("Generator.prototype.return()")}}
+
返回给定的值并结束生成器。
+
{{jsxref("Generator.prototype.throw()")}}
+
向生成器抛出一个错误。
+
+ +

示例

+ +

一个无限迭代器

+ +
function* idMaker(){
+    let index = 0;
+    while(true)
+        yield index++;
+}
+
+let gen = idMaker(); // "Generator { }"
+
+console.log(gen.next().value);
+// 0
+console.log(gen.next().value);
+// 1
+console.log(gen.next().value);
+// 2
+// ...
+ +

传统的生成器对象

+ +

Firefox (SpiderMonkey) 在 JavaScript 1.7 中也实现了一个较早版本的生成器,其中函数声明中的星号(*)不是必需的 (只需在函数体中使用yield 关键字)。但是,旧式生成器已弃用。不要使用它们;他们将被删除  ({{bug(1083482)}})。

+ +

传统的生成器方法

+ +
+
Generator.prototype.next() {{non-standard_inline}}
+
返回 {{jsxref("Operators/yield", "yield")}} 表达式产生的值. 与ES2015 生成器对象的next()方法对应.
+
Generator.prototype.close() {{non-standard_inline}}
+
关闭生成器,因此执行该函数后调用next()函数时将会抛出 {{jsxref("StopIteration")}} 错误. 与ES2015 生成器对象的return()方法对应..
+
Generator.prototype.send() {{non-standard_inline}}
+
用于将值发送到生成器。 该值由 {{jsxref("Operators/yield", "yield")}} 表达式返回, 并且返回下一个 {{jsxref("Operators/yield", "yield")}} 表达式产生的值. send(x) 对应于ES2015生成器对象中的 next(x)
+
Generator.prototype.throw() {{non-standard_inline}}
+
向生成器抛出错误. 与ES2015 生成器对象的throw()方法对应.
+
+ +

旧生成器对象示例

+ +
function fibonacci() {
+  var a = yield 1;
+  yield a * 2;
+}
+
+var it = fibonacci();
+console.log(it);          // "Generator {  }"
+console.log(it.next());   // 1
+console.log(it.send(10)); // 20
+console.log(it.close());  // undefined
+console.log(it.next());   // throws StopIteration (as the generator is now closed)
+
+ +

规范

+ + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('ES2015', '#sec-generator-objects', 'Generator objects')}}{{Spec2('ES2015')}}Initial definition.
{{SpecName('ESDraft', '#sec-generator-objects', 'Generator objects')}}{{Spec2('ESDraft')}}
+ +

浏览器兼容性

+ + + +

{{Compat("javascript.builtins.Generator")}}

+ +

相关链接

+ +

Legacy generators

+ + + +

ES2015 generators

+ + -- cgit v1.2.3-54-g00ecf