From eea703a2c1fa98a42ef7975418a27be59bc2117b Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 12 Aug 2017 10:53:44 +0800 Subject: [PATCH] docs(function): edit function --- docs/function.md | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/docs/function.md b/docs/function.md index 8779572..ca1d532 100644 --- a/docs/function.md +++ b/docs/function.md @@ -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