diff --git a/docs/function.md b/docs/function.md index aa68021..3338611 100644 --- a/docs/function.md +++ b/docs/function.md @@ -15,7 +15,7 @@ log('Hello', 'China') // Hello China log('Hello', '') // Hello World ``` -上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World。这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符,结果被改为默认值。 +上面代码检查函数`log`的参数`y`有没有赋值,如果没有,则指定默认值为`World`。这种写法的缺点在于,如果参数`y`赋值了,但是对应的布尔值为`false`,则该赋值不起作用。就像上面代码的最后一行,参数`y`等于空字符,结果被改为默认值。 为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值。这有两种写法。 @@ -60,24 +60,30 @@ var p = new Point(); 默认值的写法非常灵活,下面是一个为对象属性设置默认值的例子。 ```javascript -fetch(url, { body = '', method = 'GET', headers = {} }){ +function fetch(url, { body = '', method = 'GET', headers = {} }){ console.log(method); } + +fetch('http://example.com', {}) +// "GET" ``` -上面代码中,传入函数fetch的第二个参数是一个对象,调用的时候可以为它的三个属性设置默认值。 +上面代码中,传入函数`fetch`的第二个参数是一个对象,调用的时候可以为它的三个属性设置默认值。 -甚至还可以设置双重默认值。 +但是,这种写法不能省略第二个参数,为此可以设置双重默认值。 ```javascript -fetch(url, { method = 'GET' } = {}){ +function fetch(url, { method = 'GET' } = {}){ console.log(method); } + +fetch('http://example.com') +// "GET" ``` -上面代码中,调用函数fetch时,如果不含第二个参数,则默认值为一个空对象;如果包含第二个参数,则它的method属性默认值为GET。 +上面代码中,调用函数`fetch`时,第二个参数默认为一个空对象,而只要有第二个参数,`method`参数就默认为`GET`。 -定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。 +定义了默认值的参数,必须是函数的尾参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。 ```javascript // 以下两种写法都是错的 @@ -89,7 +95,7 @@ function f(x, y = 5, z) { } ``` -如果传入undefined,将触发该参数等于默认值,null则没有这个效果。 +如果传入`undefined`,将触发该参数等于默认值,null则没有这个效果。 ```javascript function foo(x = 5, y = 6){ @@ -100,9 +106,9 @@ foo(undefined, null) // 5 null ``` -上面代码中,x参数对应undefined,结果触发了默认值,y参数等于null,就没有触发默认值。 +上面代码中,`x`参数对应`undefined`,结果触发了默认值,`y`参数等于`null`,就没有触发默认值。 -指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。 +指定了默认值以后,函数的`length`属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,`length`属性将失真。 ```javascript (function(a){}).length // 1 @@ -110,7 +116,7 @@ foo(undefined, null) (function(a, b, c = 5){}).length // 2 ``` -上面代码中,length属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。 +上面代码中,`length`属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。 利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。 @@ -127,9 +133,9 @@ foo() // Error: Missing parameter ``` -上面代码的foo函数,如果调用的时候没有参数,就会调用默认值throwIfMissing函数,从而抛出一个错误。 +上面代码的`foo`函数,如果调用的时候没有参数,就会调用默认值`throwIfMissing`函数,从而抛出一个错误。 -从上面代码还可以看到,参数mustBeProvided的默认值等于throwIfMissing函数的运行结果(即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。 +从上面代码还可以看到,参数`mustBeProvided`的默认值等于`throwIfMissing`函数的运行结果(即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。 另一个需要注意的地方是,参数默认值所处的作用域,不是全局作用域,而是函数作用域。