Skip to content

Commit

Permalink
[zh-cn]: update the translation of Generator.return() (mdn#17711)
Browse files Browse the repository at this point in the history
Co-authored-by: A1lo <[email protected]>
Co-authored-by: Jason Ren <[email protected]>
  • Loading branch information
3 people authored and mfuji09 committed Jan 4, 2024
1 parent eb2014e commit de9a7b1
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 11 deletions.
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

0 comments on commit de9a7b1

Please sign in to comment.