Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[zh-cn]: update the translation of Generator.return() #17711

Merged
merged 4 commits into from
Jan 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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_块) 块结合使用时执行任何清理任务

## 语法

Expand All @@ -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` 方法的使用。

Expand All @@ -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() {
Expand All @@ -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 }
Expand All @@ -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}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ try {

你也可以用`try`语句去处理 JavaScript 异常。参考[JavaScript 指南](/zh-CN/docs/Web/JavaScript/Guide)了解更多关于 Javascript 异常的信息。

### 无条件的`catch`
### 无条件的 `catch`

当使用单个无条件`catch`子句时,抛出的任何异常时都会进入到`catch`块。例如,当在下面的代码中发生异常时,控制转移到`catch`子句。

Expand All @@ -69,7 +69,7 @@ try {

`catch`块指定一个标识符(在上面的示例中为 e),该标识符保存由`throw`语句指定的值。`catch`块是唯一的,因为当输入`catch`块时,JavaScript 会创建此标识符,并将其添加到当前作用域;标识符仅在`catch`块执行时存在;`catch`块执行完成后,标识符不再可用。

### 条件`catch`
### 条件 `catch`

{{non-standard_header}}

Expand Down Expand Up @@ -125,7 +125,7 @@ function isValidJSON(text) {
}
```

### `finally`
### `finally`

`finally`块包含的语句在`try`块和`catch`之后,`try..catch..finally`块后的语句之前执行。请注意,无论是否抛出异常`finally`子句都会执行。此外,如果抛出异常,即使没有`catch`子句处理异常,`finally`子句中的语句也会执行。

Expand Down