函数新增特性:
- 参数默认值
- rest参数
- 扩展运算符
- 箭头函数
- this绑定
- 尾调用
1.默认参数
{ function test(x,y = 'world'){ console.log('默认值',x,y); } test('hello'); //hello world test('hello', 'kill'); // hello kill}复制代码
首先我们看上面的代码,函数默认值就是参数含有默认值的函数,此例子中y
是有默认值的,值是world
,所以我们在调用的时候,如果没有给定第二个参数,输出的结果是 hello world
,如果给了第二个参数,那么第二个参数就会取代默认值,输出 hello kill
。 这里有一点需要注意,
函数默认值的后面不能再有其他没有默认值的参数,这样是错误的
2.作用域
{ let x = 'test'; function test2(x,y=x){ console.log('作用域',x,y) } test2('kill'); // 作用域 kill kill test2(); // 作用域 underfind underfind}复制代码
上面的代码,我们可以看到我们的函数声明中,y=x
,我们在调用函数的时候,第一次只是传入了一个参数,相当于传入了参数x
,因为y=x
,所以函数结果是 作用域 kill kill
,当没有传入参数时,两个值都是 underfind
。 下面我们将上面的函数做一些修改
{ let c = 'test'; function test2(x,y=c){ console.log('作用域',x,y) } test2('kill'); // 作用域 kill test}复制代码
我们没有在函数参数中声明 c
, 此时的值输出 kill test
,可以看出,函数的参数是有一个自己的作用域的,跟外部的作用域不是一个作用域。
3.rest参数
{ //rest 参数 function test3(...arg) { for(let v of arg) { console.log('rest', v) } } test3(1,2,3,4,'a')}复制代码
在es5中是没有这个使用方式的,只是在es6中才有,我们看一下输出的结果是什么
rest 1rest 2rest 3rest 4rest a复制代码
rest参数就是把输入的参数都转化为一个数组,这个和arguments参数有异曲同工之妙,但是不会有arguments参数第一个值的问题,这里也要注意
rest参数后不能有其他参数了
4.箭头函数
{ let arrow = v => v*2; console.log(arrow(3));}复制代码
这里有一行代码,大家可以看一下,是什么意思?输出的结果是什么?
输出的结果是: 6
这句话就是我们常听到的箭头函数:我们怎么去看这行代码呢?
- 前面的arrow是函数的名称
- v是函数的参数,如果参数有多个或者没有参数,使用 ()包裹
- => 这个符号的后面是函数的主体,前面的是参数
- 最后的 v*2 是一个返回值
所以我们调用函数arrow(3) ,返回的是 3*2 等于 6;
{ let arrow2 = () => 5; console.log(arrow2); // 5}复制代码
这个就是没有参数的时候的箭头函数表示方法。
做箭头函数的要注意类似绑定,不是所有的时候都适合用箭头函数,要随机应变。
5.尾调用##
什么是尾调用呢,就是在函数的最后一句话调用一个函数。
{ function tail(x) { console.log('tail', x) } function fx(x) { return tail(x) } fx(123) // tail 123}复制代码
我们这里的fx()
方法的最后调用了tail()
方法,这个就是一个尾调用。 那尾调用有什么作用呢,提高性能。