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 ++++++++++++++++++ .../global_objects/generator/next/index.html | 165 +++++++++++++++++++++ .../global_objects/generator/return/index.html | 99 +++++++++++++ .../global_objects/generator/throw/index.html | 142 ++++++++++++++++++ 4 files changed, 548 insertions(+) create mode 100644 files/zh-cn/web/javascript/reference/global_objects/generator/index.html create mode 100644 files/zh-cn/web/javascript/reference/global_objects/generator/next/index.html create mode 100644 files/zh-cn/web/javascript/reference/global_objects/generator/return/index.html create mode 100644 files/zh-cn/web/javascript/reference/global_objects/generator/throw/index.html (limited to 'files/zh-cn/web/javascript/reference/global_objects/generator') 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

+ + diff --git a/files/zh-cn/web/javascript/reference/global_objects/generator/next/index.html b/files/zh-cn/web/javascript/reference/global_objects/generator/next/index.html new file mode 100644 index 0000000000..96ad60c35c --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/generator/next/index.html @@ -0,0 +1,165 @@ +--- +title: Generator.prototype.next() +slug: Web/JavaScript/Reference/Global_Objects/Generator/next +tags: + - ECMAScript 2015 + - Generator + - JavaScript + - 原型 + - 参考 + - 方法 + - 生成器 +translation_of: Web/JavaScript/Reference/Global_Objects/Generator/next +--- +
{{JSRef}}
+ +

next() 方法返回一个包含属性 donevalue 的对象。该方法也可以通过接受一个参数用以向生成器传值。

+ +

语法

+ +
gen.next(value)
+ +

参数

+ +
+
value
+
向生成器传递的值.
+
+ +

返回值

+ +

返回的对象包含两个属性:

+ + + +

示例

+ +

使用 next()方法

+ +

下面的例子展示了一个简单的生成器, 以及调用 next 后方法的返回值:

+ +
function* gen() {
+  yield 1;
+  yield 2;
+  yield 3;
+}
+
+var g = gen(); // "Generator { }"
+g.next();      // "Object { value: 1, done: false }"
+g.next();      // "Object { value: 2, done: false }"
+g.next();      // "Object { value: 3, done: false }"
+g.next();      // "Object { value: undefined, done: true }"
+
+ +

向生成器传值

+ +

在此示例中,使用值调用next。 请注意,第一次调用没有记录任何内容,因为生成器最初没有产生任何结果。

+ +
function* gen() {
+  while(true) {
+    var value = yield null;
+    console.log(value);
+  }
+}
+
+var g = gen();
+g.next(1);
+// "{ value: null, done: false }"
+g.next(2);
+// 2
+// "{ value: null, done: false }"
+
+ +

规范

+ + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('ES6', '#sec-generator.prototype.next', 'Generator.prototype.next')}}{{Spec2('ES6')}}初始定义
{{SpecName('ESDraft', '#sec-generator.prototype.next', 'Generator.prototype.next')}}{{Spec2('ESDraft')}}草案
+ +

浏览器兼容性

+ +
{{CompatibilityTable}}
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatVersionUnknown}}13{{CompatGeckoDesktop(26)}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatSafari(10)}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support5.1{{CompatVersionUnknown}}{{CompatGeckoMobile(26)}}{{CompatUnknown}}{{CompatUnknown}}10
+
+
+ +

相关链接

+ + diff --git a/files/zh-cn/web/javascript/reference/global_objects/generator/return/index.html b/files/zh-cn/web/javascript/reference/global_objects/generator/return/index.html new file mode 100644 index 0000000000..9c5ed4bb99 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/generator/return/index.html @@ -0,0 +1,99 @@ +--- +title: Generator.prototype.return() +slug: Web/JavaScript/Reference/Global_Objects/Generator/return +tags: + - ECMAScript6 + - JavaScript + - 原型 + - 参考 + - 方法 + - 生成器 +translation_of: Web/JavaScript/Reference/Global_Objects/Generator/return +--- +
{{JSRef}}
+ +

return() 方法返回给定的值并结束生成器。

+ +

语法

+ +
gen.return(value)
+ +

参数

+ +
+
value
+
需要返回的值
+
+ +

返回值

+ +

返回该函数参数中给定的值.

+ +

示例

+ +

使用 return()

+ +

以下例子展示了一个简单的生成器和 return 方法的使用.

+ +
function* gen() {
+  yield 1;
+  yield 2;
+  yield 3;
+}
+
+var g = gen();
+
+g.next();        // { value: 1, done: false }
+g.return("foo"); // { value: "foo", done: true }
+g.next();        // { value: undefined, done: true }
+
+ +

如果对已经处于“完成”状态的生成器调用return(value),则生成器将保持在“完成”状态。如果没有提供参数,则返回对象的value属性与示例最后的.next()方法相同。如果提供了参数,则参数将被设置为返回对象的value属性的值。

+ +
function* gen() {
+  yield 1;
+  yield 2;
+  yield 3;
+}
+
+var g = gen();
+g.next(); // { value: 1, done: false }
+g.next(); // { value: 2, done: false }
+g.next(); // { value: 3, done: false }
+g.next(); // { value: undefined, done: true }
+g.return(); // { value: undefined, done: true }
+g.return(1); // { value: 1, done: true }
+ +

规范

+ + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('ES6', '#sec-generator.prototype.return', 'Generator.prototype.return')}}{{Spec2('ES6')}}Initial definition.
{{SpecName('ESDraft', '#sec-generator.prototype.return', 'Generator.prototype.return')}}{{Spec2('ESDraft')}}
+ +

浏览器兼容性

+ + + +

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

+ +

相关链接

+ + diff --git a/files/zh-cn/web/javascript/reference/global_objects/generator/throw/index.html b/files/zh-cn/web/javascript/reference/global_objects/generator/throw/index.html new file mode 100644 index 0000000000..13138d5484 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/generator/throw/index.html @@ -0,0 +1,142 @@ +--- +title: Generator.prototype.throw() +slug: Web/JavaScript/Reference/Global_Objects/Generator/throw +tags: + - ECMAScript6 + - JavaScript + - 参考 + - 属性 + - 方法 + - 生成器 +translation_of: Web/JavaScript/Reference/Global_Objects/Generator/throw +--- +
{{JSRef}}
+ +

throw() 方法用来向生成器抛出异常,并恢复生成器的执行,返回带有 donevalue 两个属性的对象。

+ +

语法

+ +
gen.throw(exception)
+ +

参数

+ +
+
exception
+
用于抛出的异常。 使用 {{jsxref("Error")}} 的实例对调试非常有帮助.
+
+ +

返回值

+ +

带有两个属性的{{jsxref("Object", "对象")}}:

+ + + +

示例

+ +

使用 throw()

+ +

下面的例子展示了一个简单的生成器并使用 throw方法向该生成器抛出一个异常,该异常通常可以通过 try...catch 块进行捕获.

+ +
function* gen() {
+  while(true) {
+    try {
+       yield 42;
+    } catch(e) {
+      console.log("Error caught!");
+    }
+  }
+}
+
+var g = gen();
+g.next(); // { value: 42, done: false }
+g.throw(new Error("Something went wrong")); // "Error caught!"
+
+ +

规范

+ + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('ES6', '#sec-generator.prototype.throw', 'Generator.prototype.throw')}}{{Spec2('ES6')}}Initial definition.
{{SpecName('ESDraft', '#sec-generator.prototype.throw', 'Generator.prototype.throw')}}{{Spec2('ESDraft')}} 
+ +

浏览器兼容性

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + +
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatUnknown}}{{CompatGeckoDesktop(26)}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatUnknown}}{{CompatUnknown}}{{CompatGeckoMobile(26)}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +

相关链接

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