ES6-3.函数

1、函数形参的默认值
在ES5中函数定义了参数,如果要设置默认值,则需要在函数内进行判断处理,例如:
要进行判断然后给出相应的默认值

    function makeRequest(url, timeout, callback){
        timeout = (typeof timeout !== 'undefined')? timeout :2000;
        callback = (typeof callback !== 'undefined')? callback :function(){};
    }

而在ES6中,可以在函数形参中直接定义默认值,例如:
这样就不用在函数内进行判断给与默认值

    function makeRequest(url, timeout = 2000, callback = function(){}){

    }

2、默认参数影响arguments
在ES5,非严格模式下,修改参数时,arguments也会跟着变,例如:

    function mixArgs(first, second){
        console.log(first === arguments[0]);    //true
        console.log(second === arguments[1]);   //true

        first = 'c';
        second = 'd';

        console.log(first === arguments[0]);    //true
        console.log(second === arguments[1]);   //true
    }

    mixArgs('a', 'b');

在严格模式下,则不同,修改参数,arguments的值也不会变,例如:

    function mixArgs(first, second){
        "use strict"
        console.log(first === arguments[0]);    //true
        console.log(second === arguments[1]);   //true

        first = 'c';
        second = 'd';

        console.log(first === arguments[0]);    //false
        console.log(second === arguments[1]);   //false
    }

所以在ES6下面和ES5的严格模式下,arguments的行为是一样的,修改参数值,不会影响arguments的值。

3、处理无命名参数
在函数的命名参数前添加三个点(…)就表明这是一个不定参数,该参数为一个数组,包含着自它之后传入的所有参数,通过这个数组名即可逐一访问里面的参数。例如:

    function pick(object, ...keys){
        let result = Object.create(null);

        for(let i = 0, len = keys.length; i < len; i++) {
            result[keys[i]] = object[keys[i]];
        }

        return result;
    }

需要注意的是:

(1)每个函数最多只能声明一个不定参数,而且一定要放在所有参数的末尾。

(2)不定参数不能用于对象字面量setter之中。

4、展开运算符
展开运算符其实跟不定参数基本相似。Math.max()方法返回两个参数中大的一个,那么怎么返回一个数组中最大的呢。在ES6中,就可以用下面代码:

    let values = [25, 50, 70, 100];
    console.log(Math.max(...values));

5、箭头函数
箭头函数和传统函数有以下几点不同:

(1)没有this、super、arguments和new.target绑定。

(2)不能通过new关键字调用。

(3)没有原型

(4)不可以改变this的绑定。

(5)不支持arguments对象。

(6)不支持重复的命名参数。

箭头函数一般的写法如下:

    let values = [25, 50, 70, 100];
    console.log(Math.max(...values));

    let sum = (num1, num2) => {
        return num1 + num2;
    }

创建立即执行函数表达式,例如:

    let person = ((name) => {
        return {
            getName:function(){
                return name;
            }
        }
    }

    )('Nicholas');

    console.log(person.getName());   //Nicholas

6、尾调用优化
尾调用指的是函数作为另一个函数的最后一条语句被调用
在ES5中,尾调用函数会创建一个新的栈帧,推入调用栈,所以在循环调用的时候,相互不能释放,就可能导致调用栈越来越大

在ES6中,缩减了严格模式下的尾调用栈的大小,满足以下条件,尾调用不再创建新的栈帧,而是清除并重用当前栈帧:

(1)尾调用不访问当前栈帧的变量

(2)在函数内部,尾调用是最后一条语句

(3)尾调用的结果作为函数值返回

    "use strict"
    function doSomething(){
        //优化后
        return doSomethingElse();
    }
    
    function doSomethingElse(){

    }

下面的情况不会进行优化:

    "use strict"
    function doSomething(){
        //不优化,因为不作为返回值
        doSomethingElse();
    }
      
    function doSomethingElse(){

     }
    "use strict"
    function doSomething(){
        //不优化,必须在返回值后添加其他操作
        return 1 + doSomethingElse();
    }

    function doSomethingElse(){

    }
    "use strict"
    function doSomething(){
        //不优化,因为调用不在尾部
        var result = doSomethingElse();
        return result;
    }

    function doSomethingElse(){

    }
    "use strict"
    function doSomething(){
        var num = 1,
            func = () => num;
        //不优化,该函数是个闭包
        return func();            
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值