Skip to content

Commit 7d31f94

Browse files
committed
edit function/default value
1 parent 6d71bba commit 7d31f94

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

docs/function.md

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ log('Hello', 'China') // Hello China
1515
log('Hello', '') // Hello World
1616
```
1717

18-
上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World。这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符,结果被改为默认值。
18+
上面代码检查函数`log`的参数`y`有没有赋值,如果没有,则指定默认值为`World`。这种写法的缺点在于,如果参数`y`赋值了,但是对应的布尔值为`false`,则该赋值不起作用。就像上面代码的最后一行,参数`y`等于空字符,结果被改为默认值。
1919

2020
为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值。这有两种写法。
2121

@@ -60,24 +60,30 @@ var p = new Point();
6060
默认值的写法非常灵活,下面是一个为对象属性设置默认值的例子。
6161

6262
```javascript
63-
fetch(url, { body = '', method = 'GET', headers = {} }){
63+
function fetch(url, { body = '', method = 'GET', headers = {} }){
6464
console.log(method);
6565
}
66+
67+
fetch('http://example.com', {})
68+
// "GET"
6669
```
6770

68-
上面代码中,传入函数fetch的第二个参数是一个对象,调用的时候可以为它的三个属性设置默认值。
71+
上面代码中,传入函数`fetch`的第二个参数是一个对象,调用的时候可以为它的三个属性设置默认值。
6972

70-
甚至还可以设置双重默认值
73+
但是,这种写法不能省略第二个参数,为此可以设置双重默认值
7174

7275
```javascript
73-
fetch(url, { method = 'GET' } = {}){
76+
function fetch(url, { method = 'GET' } = {}){
7477
console.log(method);
7578
}
79+
80+
fetch('http://example.com')
81+
// "GET"
7682
```
7783

78-
上面代码中,调用函数fetch时,如果不含第二个参数,则默认值为一个空对象;如果包含第二个参数,则它的method属性默认值为GET
84+
上面代码中,调用函数`fetch`时,第二个参数默认为一个空对象,而只要有第二个参数,`method`参数就默认为`GET`
7985

80-
定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。
86+
定义了默认值的参数,必须是函数的尾参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。
8187

8288
```javascript
8389
// 以下两种写法都是错的
@@ -89,7 +95,7 @@ function f(x, y = 5, z) {
8995
}
9096
```
9197

92-
如果传入undefined,将触发该参数等于默认值,null则没有这个效果。
98+
如果传入`undefined`,将触发该参数等于默认值,null则没有这个效果。
9399

94100
```javascript
95101
function foo(x = 5, y = 6){
@@ -100,17 +106,17 @@ foo(undefined, null)
100106
// 5 null
101107
```
102108

103-
上面代码中,x参数对应undefined,结果触发了默认值,y参数等于null,就没有触发默认值。
109+
上面代码中,`x`参数对应`undefined`,结果触发了默认值,`y`参数等于`null`,就没有触发默认值。
104110

105-
指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真
111+
指定了默认值以后,函数的`length`属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,`length`属性将失真
106112

107113
```javascript
108114
(function(a){}).length // 1
109115
(function(a = 5){}).length // 0
110116
(function(a, b, c = 5){}).length // 2
111117
```
112118

113-
上面代码中,length属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。
119+
上面代码中,`length`属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。
114120

115121
利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。
116122

@@ -127,9 +133,9 @@ foo()
127133
// Error: Missing parameter
128134
```
129135

130-
上面代码的foo函数,如果调用的时候没有参数,就会调用默认值throwIfMissing函数,从而抛出一个错误。
136+
上面代码的`foo`函数,如果调用的时候没有参数,就会调用默认值`throwIfMissing`函数,从而抛出一个错误。
131137

132-
从上面代码还可以看到,参数mustBeProvided的默认值等于throwIfMissing函数的运行结果(即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。
138+
从上面代码还可以看到,参数`mustBeProvided`的默认值等于`throwIfMissing`函数的运行结果(即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。
133139

134140
另一个需要注意的地方是,参数默认值所处的作用域,不是全局作用域,而是函数作用域。
135141

0 commit comments

Comments
 (0)