1.函数参数的默认值
1.在ES6中,定义函数时可以为函数设置默认参数,当参数不够或者未传入参数时,当前参数的值会默认为已有的默认参数的值。
要注意的是该参数相当于是默认声明的,所以函数内部不能再次定义该参数变量,否则会报错。
2.函数的默认值可以和解构赋值默认值结合起来,在定义参数默认值时再提供一层保障,保证在某些情况下函数不会报错。
这种情况就是当函数参数为对象且对象中a没有默认参数,在调用时报错undified。解决办法就是对该对象赋值一个默认的解构赋值。
此时当未给函数参数时相当于默认了一个空对象的参数,从而防止了由于参数问题报错。
3.参数默认值的位置
一般来说,具有默认值的参数应该尽可能地写在后面,这样若调用函数时该参数没有值的输入,可以直接省略该参数。但是如果其后面有没有默认值的参数,则不能略写。
因为此时传入的参数覆盖了a和b而c就属于未定义undifined,相加结果为NaN。但是当默认参数在尾部时,传入的参数会先把所有的未赋默认值的参数赋值,未赋值的则会取其默认值,结果不会报错。
4.函数的length属性
该属性将返回没有指定默认值的参数个数,而当检索到有默认值的参数后,后续的参数将不再检查。即若是第一个参数指定了默认值,则其返回值为0。
4.作用域问题
当设置了默认参数且函数进行声明时,参数会形成单独的作用域,而在声明结束时又会消失。不设置默认参数时是不会有该作用域的。
此时在参数作用域下,y指向的x是参数内部的x而非父级的x,所以所取值是2而不是1。
2.rest参数
ES6加入了rest参数(...变量名)来获取多余的参数,放置于一个数组中,且rest参数只能放置于参数的尾部,否则会报错。
3.箭头函数
ES6中允许以箭头=>定义函数,当函数的参数为0个或者多个时,需使用括号(),为1个参数时可以不使用括号。
如果函数体代码多余一句,就需要用大括号{}括起来,并且使用return语句返回。
如果函数需返回一个数组,则需要在数组外使用一个小括号()保住数组的大括号{},否则会报错。
注意事项:
- 箭头函数没有自己的
this对象。 - 不可以被当作构造函数
- 没有
arguments对象,但可以使用rest参数 - 不可以使用
yield命令 - 箭头函数在参数和箭头之间不能换行
箭头函数this指向问题
由于箭头函数没有自己的this,所以当调用他的this时实际是调用其其外层第一个普通函数的this。当其外部没有普通函数时,其this指向window。虽然箭头函数的this指向不能更改,但是外层函数的this指向却是可以改变的,所以可以通过改变外部this的指向来间接改变箭头函数的this。