• js箭头函数


    ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

    为什么叫Arrow Function?因为它的定义用的就是一个箭头

    x =>x*x

    相当于:

    function(x) {
                return x*x;
            }

    箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{……}和return都省略掉了。还有一种可以包含多条语句。这个时候就不能省略{……}和return:

        x=>{
                if(x>0){
                    return x*x;
                }
                else {
                    return - x*x;
                }
            }

    如果参数不是一个,就需要用括号()起来:

        //两个参数:
            (x,y) => x * x + y * y
            //无参数
            () => 3.14
            //可变参数:
            (x,y,...rest) =>{
                var i,sum=x+y;
                for(i=0;i<rest.length;i++) {
                    sum += rest[i];
                }
                return sum;
            }

    如果要返回一个对象,就要注意,如果是单表达式,要这么写:

    //SyntaxError
    x =>{foo:x}
    
    //因为和函数体的{……}有语法冲突,所以:
    //ok
    x=>({foo:x})

    this

    箭头函数看上去是匿名函数的一种简写,但是实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。由于JavaScript函数对this绑定的错误处理。下面的例子无法得到预期结果:

      var obj = {
                birth:1990,
                getAge:function(){
                    var b = this.birth;//1990
                    var fn = function(){
                        return new Date().getFullYear() - this.birth;//this指向window或undefined
                    };
                    return fn();
                }
            };

    现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj:

        var obj = {
                birth:1990,
                getAge:function () {
                    var b = this.birth;//1990
                    var fn = () => new Date().getFullYear() - this.birth;//this指向obj对象
                    return fn();
                }
            };
            obj.getAge();//27

    由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略:

        var obj = {
                birth:1990,
                getAge:function(year) {
                    var b = this.birth;//1990
                    var fn = (y) =>y-this.birth;//this.birth仍是1990
                    return fn.call({birth:2000},year);
                }
            };
            obj.getAge(2015);//25
  • 相关阅读:
    golang与vscode的安装与配置
    numpy学习之前的必要数学知识:线性代数
    分布式系统设计系列 -- 基本原理及高可用策略
    微服务的4个设计原则和19个解决方案
    JAVA8 十大新特性详解
    ConcurrentHashMap总结
    Java NIO理解与使用
    深入了解 Java-Netty高性能高并发理解
    java内存泄漏的定位与分析
    Netty高性能编程备忘录(下)
  • 原文地址:https://www.cnblogs.com/yuanxinru321/p/7706695.html
Copyright © 2020-2023  润新知