From fd1bf457e2051c27584a3ae5376a7c0d3398e739 Mon Sep 17 00:00:00 2001 From: Jason Lam Date: Thu, 4 Jan 2024 17:05:48 +0800 Subject: [PATCH] [zh-cn]: update the translation of Generator.return() (#17711) Co-authored-by: A1lo Co-authored-by: Jason Ren <40999116+jasonren0403@users.noreply.github.com> --- .../global_objects/generator/return/index.md | 84 +++++++++++++++++-- .../reference/statements/try...catch/index.md | 6 +- 2 files changed, 79 insertions(+), 11 deletions(-) diff --git a/files/zh-cn/web/javascript/reference/global_objects/generator/return/index.md b/files/zh-cn/web/javascript/reference/global_objects/generator/return/index.md index e3cfaca15b51f5..f2516739480663 100644 --- a/files/zh-cn/web/javascript/reference/global_objects/generator/return/index.md +++ b/files/zh-cn/web/javascript/reference/global_objects/generator/return/index.md @@ -1,11 +1,13 @@ --- title: Generator.prototype.return() slug: Web/JavaScript/Reference/Global_Objects/Generator/return +l10n: + sourceCommit: fb85334ffa4a2c88d209b1074909bee0e0abd57a --- {{JSRef}} -**`return()`** 方法返回给定的值并结束生成器。 +{{jsxref("Generator")}} 实例的 **`return()`** 方法的作用就好像一个 `return` 语句被插入到生成器主体的当前暂停位置,这会结束生成器并允许生成器与 [`try...finally`](/zh-CN/docs/Web/JavaScript/Reference/Statements/try...catch#finally_块) 块结合使用时执行任何清理任务。 ## 语法 @@ -16,16 +18,27 @@ generatorInstance.return(value) ### 参数 -- `value` - - : 需要返回的值 +- `value` {{optional_inline}} + - : 要返回的值。 ### 返回值 -返回该函数参数中给定的值。 +一个 {{jsxref("Object")}},有以下两个属性: + +- `done` + - : 一个布尔值: + - 如果该生成器函数的控制流程已经结束,则为 `true`。 + - 如果该生成器函数的控制流程还未结束并能产生更多的值,则为 `false`。只有在 [`try...finally`](/zh-CN/docs/Web/JavaScript/Reference/Statements/try...catch#finally_块) 中捕获 `return` 并且 `finally` 块中还有更多的 `yield` 表达式时才会发生这种情况。 +- `value` + - : 给定的作为参数的值,或者,如果 `yield` 表达式包含在 [`try...finally`](/zh-CN/docs/Web/JavaScript/Reference/Statements/try...catch#finally_块),从 `finally` 块产生/返回的值。 + +## 描述 + +`return()` 方法在被调用时,可以看作是在生成器主体当前暂停的位置插入了一个 `return value;` 语句,其中 `value` 是传入给 `return()` 方法的值。因此,在典型的流程中,调用 `return(value)` 将返回 `{done: true, value: value }`。然而,如果 `yield` 表达式被包含在 `try...finally` 块中,控制流不会退出函数体,而是进入 `finally` 块。在这种情况下,如果 `finally` 块中有更多 `yield` 表达式,返回的值可能会不同,`done` 甚至可能是 `false`。 ## 示例 -### 使用 `return()` +### 使用 return() 以下例子展示了一个简单的生成器和 `return` 方法的使用。 @@ -36,14 +49,16 @@ function* gen() { yield 3; } -var g = gen(); +const 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`属性的值。 +如果对已经处于“完成”状态的生成器调用 `return(value)`,则生成器将保持在“完成”状态。 + +如果没有提供参数,则返回对象的 `value` 将为 `undefined`。如果提供了参数,则参数将被设置为返回对象的 `value` 属性的值,除非 `yield` 表达式被包装在 `try...finally` 中。 ```js function* gen() { @@ -52,7 +67,7 @@ function* gen() { yield 3; } -var g = gen(); +const g = gen(); g.next(); // { value: 1, done: false } g.next(); // { value: 2, done: false } g.next(); // { value: 3, done: false } @@ -61,6 +76,59 @@ g.return(); // { value: undefined, done: true } g.return(1); // { value: 1, done: true } ``` +### 将 return() 与 try...finally 一起使用 + +如果 `yield` 表达式被包含在一个 `try...finally` 块中,只有生成器本身才能知道 `return` 方法已被调用。 + +当在 `try` 块中暂停的生成器上调用 `return` 方法时,生成器中的执行将继续到 `finally` 块——因为 `try...finally` 语句的 `finally` 块始终执行。 + +```js +function* gen() { + yield 1; + try { + yield 2; + yield 3; + } finally { + yield "cleanup"; + } +} + +const g1 = gen(); +g1.next(); // { value: 1, done: false } + +// 在 try...finally 前暂停执行。 +g1.return("early return"); // { value: 'early return', done: true } + +const g2 = gen(); +g2.next(); // { value: 1, done: false } +g2.next(); // { value: 2, done: false } + +// 在 try...finally 中暂停执行。 +g2.return("early return"); // { value: 'cleanup', done: false } + +// 完成值被保留 +g2.next(); // { value: 'early return', done: true } + +// 生成器处于完成状态 +g2.return("not so early return"); // { value: 'not so early return', done: true } +``` + +finally 块的返回值也可以成为 `return` 调用返回结果的 `value`。 + +```js +function* gen() { + try { + yield 1; + } finally { + return "cleanup"; + } +} + +const g1 = gen(); +g1.next(); // { value: 1, done: false } +g1.return("early return"); // { value: 'cleanup', done: true } +``` + ## 规范 {{Specifications}} diff --git a/files/zh-cn/web/javascript/reference/statements/try...catch/index.md b/files/zh-cn/web/javascript/reference/statements/try...catch/index.md index b8a5bf7c2b1ecf..e9f0bf82341b90 100644 --- a/files/zh-cn/web/javascript/reference/statements/try...catch/index.md +++ b/files/zh-cn/web/javascript/reference/statements/try...catch/index.md @@ -54,7 +54,7 @@ try { 你也可以用`try`语句去处理 JavaScript 异常。参考[JavaScript 指南](/zh-CN/docs/Web/JavaScript/Guide)了解更多关于 Javascript 异常的信息。 -### 无条件的`catch`块 +### 无条件的 `catch` 块 当使用单个无条件`catch`子句时,抛出的任何异常时都会进入到`catch`块。例如,当在下面的代码中发生异常时,控制转移到`catch`子句。 @@ -69,7 +69,7 @@ try { `catch`块指定一个标识符(在上面的示例中为 e),该标识符保存由`throw`语句指定的值。`catch`块是唯一的,因为当输入`catch`块时,JavaScript 会创建此标识符,并将其添加到当前作用域;标识符仅在`catch`块执行时存在;`catch`块执行完成后,标识符不再可用。 -### 条件`catch`块 +### 条件 `catch` 块 {{non-standard_header}} @@ -125,7 +125,7 @@ function isValidJSON(text) { } ``` -### `finally`块 +### `finally` 块 `finally`块包含的语句在`try`块和`catch`之后,`try..catch..finally`块后的语句之前执行。请注意,无论是否抛出异常`finally`子句都会执行。此外,如果抛出异常,即使没有`catch`子句处理异常,`finally`子句中的语句也会执行。