函数新增特性:
- 参数默认值
- 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 1
rest 2
rest 3
rest 4
rest 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()
方法,这个就是一个尾调用。
那尾调用有什么作用呢,提高性能。