edit function/default value

This commit is contained in:
ruanyf
2015-10-08 07:54:19 +08:00
parent 6d71bba4ed
commit 7d31f94c82
+19 -13
View File
@@ -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语言不一样。
另一个需要注意的地方是,参数默认值所处的作用域,不是全局作用域,而是函数作用域。