ES6 --- 函数扩展

函数新增特性:

  • 参数默认值
  • 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()方法,这个就是一个尾调用。
那尾调用有什么作用呢,提高性能

猜你喜欢

转载自blog.csdn.net/wangdan_2013/article/details/79606615