Skip to content

Commit

Permalink
update: 校对修改
Browse files Browse the repository at this point in the history
  • Loading branch information
lilins committed Aug 7, 2017
1 parent d46d69a commit 2cc14d3
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions ch2.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

你还记得你在学校里学习任何有关 `f(x)` 的知识吗?还有方程 `y = f(x)` ?

现有方程式定义如下:<code>f(x) = 2x<sup>2</sup> + 3</code>. 这个方程有什么意义?它对应的图像是什么样的呢?如下图:
现有方程式定义如下:<code>f(x) = 2x<sup>2</sup> + 3</code>这个方程有什么意义?它对应的图像是什么样的呢?如下图:

<img src="fig1.png">

Expand Down Expand Up @@ -94,8 +94,8 @@ foo.length; // 3
举个例子,如果 `fn` 可能指向的函数分别期望 1、2 或 3 个参数,但你只希望把变量 `x` 放在最后的位置传入:

```js
// `fn` 是一些函数的引用
// `x` 是存在的值
// fn 是一些函数的引用
// x 是存在的值

if (fn.length == 1) {
fn( x );
Expand Down Expand Up @@ -195,7 +195,7 @@ function foo(...args) {

说到 ES6 的好,你肯定想知道一些小秘诀。在这里将会介绍一些,更多的内容推荐你阅读《You Don't Know JS: ES6 & Beyond》这本书的第 2 章。

#### 关于实参(Argument)的小技巧
#### 关于实参的小技巧

如果你希望调用函数的时候只传一个数组代替之前的多个参数,该怎么办?

Expand All @@ -209,7 +209,7 @@ var arr = [ 1, 2, 3, 4, 5 ];
foo( ...arr ); // 4
```

我们的新朋友 `...` 在这里被使用到了,但不仅仅在实参列表,在函数调用的时候,同样使用在实参列表。在这里的情况有所不同:在形参列表,它把实参**整合**。在实参列表,它把实参**展开**。所以 `arr` 的内容是以函数 `foo(..)` 引用的单独参数进行展开。你能理解传入一个引用值和传入整个 `arr` 数组两者之间的不同了吗?
我们的新朋友 `...` 在这里被使用到了,但不仅仅在形参列表,在函数调用的时候,同样使用在实参列表。在这里的情况有所不同:在形参列表,它把实参**整合**。在实参列表,它把实参**展开**。所以 `arr` 的内容是以函数 `foo(..)` 引用的单独参数进行展开。你能理解传入一个引用值和传入整个 `arr` 数组两者之间的不同了吗?

顺带一提,多个值和 `...` 是可以相互交错放置的,如下:

Expand All @@ -219,15 +219,15 @@ var arr = [ 2 ];
foo( 1, ...arr, 3, ...[4,5] ); // 4
```

在对称的意义上来考虑 `...` :在值列表的情况,它会**展开**。在赋值的情况,它就像形参列一样,因为实参会**赋值**到形参上。
在对称的意义上来考虑 `...` :在值列表的情况,它会**展开**。在赋值的情况,它就像形参列表一样,因为实参会**赋值**到形参上。

无论采取什么行为, `...` 都会让实参数组更容易操作。那些我们使用实参数组 `slice(..)``concat(..)``apply(..)` 的日子已经过去了。

#### 关于形参(Parameter)的小技巧
#### 关于形参的小技巧

在 ES6 中,形参可以声明**默认值**。当形参没有传入到实参中,或者传入值是 `undefined`,会进行默认赋值的操作。

思考以下
思考下面代码

```js
function foo(x = 3) {
Expand All @@ -244,7 +244,7 @@ foo( 0 ); // 0

另一个我们可以在参数中使用的 ES6 技巧,被称为“解构”。在这里我们只会简单一提,因为要说清这个话题实在太过繁杂。在这里推荐《ES6 & Beyond》这本书了解更多信息。

记住我们的之前提到可以接受 318 个参数的 `foo(..)` 吗?
还记得我们之前提到的可以接受 318 个参数的 `foo(..)` 吗?

```js
function foo(...args) {
Expand Down Expand Up @@ -274,7 +274,7 @@ function foo( [x,y,...args] = [] ) {
foo( [1,2,3] );
```

你看到了在参数列出现的 `[ .. ]` 了吗?这就是数组解构。解构是一种通过你期望的模式来描述数据(对象,数组等),还有如何分配(赋值)
你看到了在参数列出现的 `[ .. ]` 了吗?这就是数组解构。解构是通过你期望的模式来描述数据(对象,数组等),并分配(赋值)值的一种方式

在这里例子中,解构告诉解析器,一个数组应该出现的赋值位置(即参数)。这种模式是:拿出数组中的第一个值,并且赋值给局部参数变量 `x`,第二个赋值给 `y`,剩下的则**组成** `args`

Expand All @@ -290,7 +290,7 @@ function foo(params) {
}
```

现在我们可以发现,在我们这本书中要多次提到的原则第一条:声明性代码通常比命令式代码更干净。
现在我们可以发现,在我们这本书中要多次提到的第一条原则:声明性代码通常比命令式代码更干净。

声明式代码,如同之前代码片段里的解构,强调一段代码的输出结果。命令式代码,像刚才我们自己手动赋值的例子,注重的是如何得到结果。如果你稍晚再读这一段代码,你必须在脑子里面再执行一遍才能得到你想要的结果。这个结果是**编写**在这儿,但是不是直接可见的。

Expand Down Expand Up @@ -572,7 +572,7 @@ var f = foo();
f( "Hello!" ); // Hello!
```

`return` 不是唯一的办法来“输出”函数
`return` 不是“输出”函数的唯一办法

```js
function foo() {
Expand Down Expand Up @@ -657,7 +657,7 @@ score(); // 2
score( 13 ); // 15
```

**警告:** 我们将在稍后的文本中介绍更多。不过在这个例子中,你需要尽可能避免使用闭包来记录状态更改(`val`)。
**警告:** 我们将在之后的段落中介绍更多。不过在这个例子中,你需要尽可能避免使用闭包来记录状态更改(`val`)。

如果你需要设置两个输入,一个你已经知道,另一个还需要后面才能知道,你可以使用闭包来记录第一个输入值:

Expand All @@ -668,7 +668,7 @@ function makeAdder(x) {
};
}

//我们已经分别知道作为第一个输入的 `10``37`
//我们已经分别知道作为第一个输入的 1037
var addTo10 = makeAdder( 10 );
var addTo37 = makeAdder( 37 );

Expand Down Expand Up @@ -800,7 +800,7 @@ function findPropIn(propName,obj) {
```js
// 异步情况:
setTimeout( function waitForIt(){
// `it` 存在了吗?
// it 存在了吗?
if (!o.it) {
// 再试一次
setTimeout( waitForIt, 100 );
Expand Down Expand Up @@ -860,9 +860,9 @@ people.map( function getPreferredName(person){

但是,我们把易写性拿来与易读性做交换,这不是一个好选择。因为懒而不想为你的函数命名,这是常见的使用匿名功能的借口。

**命名所有单个函数**如果你对着你写的函数,想不出一个好名称,我明确告诉你,那是你并没有完全理解这个函数的目的——或者来说它的目的太广泛或太抽象。你需要重新设计功能,直到它更清楚。从这个角度说,一个名称会更明白清晰。
**命名所有单个函数**如果你对着你写的函数,想不出一个好名称,我明确告诉你,那是你并没有完全理解这个函数的目的——或者来说它的目的太广泛或太抽象。你需要重新设计功能,直到它更清楚。从这个角度说,一个名称会更明白清晰。

我从我自己的经验中证明,在思考名称的过程中,我会更好地了解它,甚至重构其设计,以提高可读性和可维护性。这些时间的投入是值得的。
从我自己的经验中证明,在思考名称的过程中,我会更好地了解它,甚至重构其设计,以提高可读性和可维护性。这些时间的投入是值得的。

### 没有 `function` 的函数

Expand Down Expand Up @@ -925,7 +925,7 @@ people.map( person =>

JavaScript 的 `function` 有一个 `this` 关键字,每个函数调用都会自动绑定。`this` 关键字有许多不同的方式描述,但我更喜欢说它提供了一个对象上下文来使该函数运行。

`this` 是你函数的一个隐式的输入参数
`this` 是函数的一个隐式的输入参数

思考:

Expand Down

0 comments on commit 2cc14d3

Please sign in to comment.