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

修改“参数”为“实参”或“形参”,并优化部分翻译 #1237

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
48 changes: 24 additions & 24 deletions 1-js/02-first-steps/15-function-basics/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,31 +172,31 @@ showMessage(from, "Hello"); // *Ann*: Hello
alert( from ); // Ann
```

当一个值被作为函数参数(parameter)传递时,它也被称为 **参数(argument)**。
当一个值被传递给函数时,它被称为**实参(argument)**,而在函数定义中接收这些值的变量被称为**形参(parameter)**。

换一种方式,我们把这些术语搞清楚:

- 参数(parameter)是函数声明中括号内列出的变量(它是函数声明时的术语)。
- 参数(argument)是调用函数时传递给函数的值(它是函数调用时的术语)。
- 形参(parameter)是函数声明中括号内列出的变量(它是函数声明时的术语)。
- 实参(argument)是调用函数时传递给函数的值(它是函数调用时的术语)。

我们声明函数时列出它们的参数(parameters),然后调用它们传递参数(arguments)。
我们声明函数时列出它们的形参(parameters),然后调用它们传递实参(arguments)。

在上面的例子中,我们可以说:“函数 `showMessage` 被声明,并且带有两个参数(parameters),随后它被调用,两个参数(arguments)分别为 `from` 和 `"Hello"`”。
在上面的例子中,我们可以说:“函数 `showMessage` 被声明,并且带有两个形参(parameters),随后它被调用,两个实参(arguments)分别为 `from` 和 `"Hello"`”。


## 默认值

如果一个函数被调用,但有参数(argument)未被提供,那么相应的值就会变成 `undefined`。
如果一个函数被调用,但有实参(argument)未被提供,那么相应的值就会变成 `undefined`。

例如,之前提到的函数 `showMessage(from, text)` 可以只使用一个参数(argument)调用:
例如,之前提到的函数 `showMessage(from, text)` 可以只使用一个实参(argument)调用:

```js
showMessage("Ann");
```

那不是错误,这样调用将输出 `"*Ann*: undefined"`。因为参数 `text` 的值未被传递,所以变成了 `undefined`。
那不是错误,这样调用将输出 `"*Ann*: undefined"`。因为形参 `text` 的值未被传递,所以变成了 `undefined`。

我们可以使用 `=` 为函数声明中的参数指定所谓的“默认”(如果对应参数的值未被传递则使用)值:
我们可以使用 `=` 为函数声明中的形参指定所谓的“默认”(如果没有传递对应的实参则使用)值:

```js run
function showMessage(from, *!*text = "no text given"*/!*) {
Expand All @@ -206,9 +206,9 @@ function showMessage(from, *!*text = "no text given"*/!*) {
showMessage("Ann"); // Ann: no text given
```

现在如果 `text` 参数未被传递,它将会得到值 `"no text given"`。
现在如果 `text` 实参未被传递,它将会得到值 `"no text given"`。

这里 `"no text given"` 是一个字符串,但它可以是更复杂的表达式,并且只会在缺少参数时才会被计算和分配。所以,这也是可能的:
这里 `"no text given"` 是一个字符串,但它可以是更复杂的表达式,并且只会在缺少实参时才会被计算和分配。所以,这也是可能的:

```js run
function showMessage(from, text = anotherFunction()) {
Expand All @@ -217,16 +217,16 @@ function showMessage(from, text = anotherFunction()) {
}
```

```smart header="默认参数的计算"
在 JavaScript 中,每次函数在没带个别参数的情况下被调用,默认参数会被计算出来
```smart header="形参的默认值机制"
在 JavaScript 中,如果调用函数时没有提供相应的实参,那么对应的形参会被赋予默认值

在上面的例子中,如果传递了参数 `text`,那么 `anotherFunction()` 就不会被调用。
在上面的例子中,如果传递了 `text` 的实参,那么 `anotherFunction()` 就不会被调用。

如果没传递参数 `text`,那么 `anotherFunction()` 就会被调用。
如果没传递 `text` 的实参,那么 `anotherFunction()` 就会被调用。
```

````smart header="在 JavaScript 老代码中的默认参数"
几年前,JavaScript 不支持默认参数的语法。所以人们使用其他方式来设置默认参数
````smart header="在 JavaScript 老代码中的默认实参"
几年前,JavaScript 不支持默认实参的语法。所以人们使用其他方式来设置默认实参

如今,我们会在旧代码中看到它们。

Expand Down Expand Up @@ -257,18 +257,18 @@ function showMessage(from, text) {
````


### 后备的默认参数
### 备选实参

有些时候,将参数默认值的设置放在函数执行(相较更后期)而不是函数声明时,也行得通。
有些时候,将形参的默认值的设置放在函数执行时(而不是在函数声明时),也行得通。

我们可以通过将参数与 `undefined` 进行比较,来检查该参数是否在函数执行期间被传递进来
我们可以通过将形参与 `undefined` 进行比较,来检查对应的实参是否在函数执行期间被传递进来

```js run
function showMessage(text) {
// ...

*!*
if (text === undefined) { // 如果参数未被传递进来
if (text === undefined) { // 如果实参未被传递进来
text = 'empty message';
}
*/!*
Expand Down Expand Up @@ -516,13 +516,13 @@ function name(parameters, delimited, by, comma) {
}
```

- 作为参数传递给函数的值,会被复制到函数的局部变量
- 作为实参传递给函数的值,会被复制到函数的形参对应的局部变量中
- 函数可以访问外部变量。但它只能从内到外起作用。函数外部的代码看不到函数内的局部变量。
- 函数可以返回值。如果没有返回值,则其返回的结果是 `undefined`。

为了使代码简洁易懂,建议在函数中主要使用局部变量和参数,而不是外部变量
为了提高代码的简洁性和易读性,建议在函数内部主要使用局部变量和形参,而不是依赖外部变量

与不获取参数但将修改外部变量作为副作用的函数相比,获取参数、使用参数并返回结果的函数更容易理解
相比于那些不依赖于实参而是通过修改外部变量产生副作用的函数,那些依赖于实参、使用这些实参并返回结果的函数更容易理解。

函数命名:

Expand Down
6 changes: 3 additions & 3 deletions 1-js/02-first-steps/16-function-expressions/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ let sayHi = function() {

让我们多举几个例子,看看如何将函数作为值来传递以及如何使用函数表达式。

我们写一个包含三个参数的函数 `ask(question, yes, no)`:
我们写一个包含三个形参的函数 `ask(question, yes, no)`:

`question`
: 关于问题的文本
Expand Down Expand Up @@ -140,13 +140,13 @@ function showCancel() {
alert( "You canceled the execution." );
}

// 用法:函数 showOk 和 showCancel 被作为参数传入到 ask
// 用法:函数 showOk 和 showCancel 被作为实参传入到 ask
ask("Do you agree?", showOk, showCancel);
```

在实际开发中,这样的函数是非常有用的。实际开发与上述示例最大的区别是,实际开发中的函数会通过更加复杂的方式与用户进行交互,而不是通过简单的 `confirm`。在浏览器中,这样的函数通常会绘制一个漂亮的提问窗口。但这是另外一件事了。

`ask` 的两个参数值 `showOk` 和 `showCancel` 可以被称为 **回调函数** 或简称 **回调**。
`ask` 的两个实参 `showOk` 和 `showCancel` 可以被称为 **回调函数** 或简称 **回调**。

主要思想是我们传递一个函数,并期望在稍后必要时将其“回调”。在我们的例子中,`showOk` 是回答 "yes" 的回调,`showCancel` 是回答 "no" 的回调。

Expand Down