docs(function): edit function

This commit is contained in:
ruanyf
2017-08-12 10:53:44 +08:00
parent 5c035974a2
commit eea703a2c1
+26 -12
View File
@@ -67,6 +67,12 @@ function foo(x = 5) {
使用参数默认值时,函数不能有同名参数。
```javascript
// 不报错
function foo(x, x, y) {
// ...
}
// 报错
function foo(x, x, y = 1) {
// ...
}
@@ -98,15 +104,25 @@ function foo({x, y = 5}) {
console.log(x, y);
}
foo({}) // undefined, 5
foo({x: 1}) // 1, 5
foo({x: 1, y: 2}) // 1, 2
foo({}) // undefined 5
foo({x: 1}) // 1 5
foo({x: 1, y: 2}) // 1 2
foo() // TypeError: Cannot read property 'x' of undefined
```
上面代码使用了对象的解构赋值默认值,没有使用函数参数的默认值。只有当函数`foo`的参数是一个对象时,变量`x``y`才会通过解构赋值生成。如果函数`foo`调用时参数不是对象,变量`x``y`就不会生成,从而报错。如果参数对象没有`y`属性,`y`的默认值5才会生效
上面代码使用了对象的解构赋值默认值,没有使用函数参数的默认值。只有当函数`foo`的参数是一个对象时,变量`x``y`才会通过解构赋值生成。如果函数`foo`调用时没提供参数,变量`x``y`就不会生成,从而报错。通过提供函数参数的默认值,就可以避免这种情况
下面是另一个对象的解构赋值默认值的例子。
```javascript
function foo({x, y = 5} = {}) {
console.log(x, y);
}
foo() // undefined 5
```
上面代码指定,如果没有提供参数,函数`foo`的参数默认为一个空对象。
下面是另一个解构赋值默认值的例子。
```javascript
function fetch(url, { body = '', method = 'GET', headers = {} }) {
@@ -120,9 +136,7 @@ fetch('http://example.com')
// 报错
```
上面代码中,如果函数`fetch`的第二个参数是一个对象,就可以为它的三个属性设置默认值。
上面的写法不能省略第二个参数,如果结合函数参数的默认值,就可以省略第二个参数。这时,就出现了双重默认值。
上面代码中,如果函数`fetch`的第二个参数是一个对象,就可以为它的三个属性设置默认值。这种写法不能省略第二个参数,如果结合函数参数的默认值,就可以省略第二个参数。这时,就出现了双重默认值。
```javascript
function fetch(url, { method = 'GET' } = {}) {
@@ -156,15 +170,15 @@ function m2({x, y} = { x: 0, y: 0 }) {
m1() // [0, 0]
m2() // [0, 0]
// x和y都有值的情况
// x 和 y 都有值的情况
m1({x: 3, y: 8}) // [3, 8]
m2({x: 3, y: 8}) // [3, 8]
// x有值,y无值的情况
// x 有值,y 无值的情况
m1({x: 3}) // [3, 0]
m2({x: 3}) // [3, undefined]
// x和y都无值的情况
// x 和 y 都无值的情况
m1({}) // [0, 0];
m2({}) // [undefined, undefined]
@@ -225,7 +239,7 @@ foo(undefined, null)
上面代码中,`length`属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。比如,上面最后一个函数,定义了3个参数,其中有一个参数`c`指定了默认值,因此`length`属性等于`3`减去`1`,最后得到`2`
这是因为`length`属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,rest 参数也不会计入`length`属性。
这是因为`length`属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest 参数也不会计入`length`属性。
```javascript
(function(...args) {}).length // 0