ES6中的 箭头函数

目录

箭头函数

1.箭头函数没有关键字function声明,就直接当作一种数据看待。

2.箭头函数也属于函数类型

3.箭头函数中this指向:

4.箭头函数写法上与普通函数的区别

6.箭头函数里面不存在 arguments关键字(保存传入的实参)

7.bind()/call() 能改变箭头函数中this指向么? 不能

8.用箭头函数解决回调函数相关的问题

9.箭头函数参数也有默认值

10.注意点:


箭头函数是 ES6中出的一种函数的声明方法

以前学的两种函数声明方式:

1.声明式 (在作用域内部有提升) 

作用域中直接写了一个function函数,除了这种其它都是定义式

2.定义式

bind语法,和匿名函数自调用只有定义式函数才可以。

判定是定义式还是声明式的方法,判定声明式,因为不是声明式就是定义式。

eg:say:function(){}所在代码块不是作用域,,所以对象的方法属于定义式函数。

<script>
    var obj ={
        name:'blue',
        say:function(){}
    }
</script>

方法错误写法:

方法只能写在对象里面或者类里面,不能直接在作用域中写:

<script>
    let a= say(){};  //错误写法
    console.log();
</script>

箭头函数

类似于函数的定义式写法,用一个变量/数组/对象等保存起来,箭头函数没有function关键字,用=>指向函数体

<script>
    var fn = (a,b)=>{
        return a + b;
    }
    var re = fn(100,200);
    console.log(re); //300
</script>

1.箭头函数没有关键字function声明,就直接当作一种数据看待。

2.箭头函数也属于函数类型

<script>
    var fn = (a,b)=>{
        return a + b;
    }
    console.log(typeof fn); //"function"
</script>

3.箭头函数中this指向:

普通函数中this指向,离他  最近的 (或者嵌套级别)的function /方法  这个函数的   调用者直到顶层都没有就是window(普通函数中this要看函数的调用者)

箭头函数this指向:this是离他  最近的  嵌套的function /方法 (不能算箭头函数 ) 这个函数的   调用者直到顶层都没有就是window(箭头函数this不看箭头函数的调用者)

<script>
    var fn = (a,b)=>{
        console.log(this,1111);   //window 1111
        return a+b;
    }
    var re = fn(1,2);  
    console.log(re); //3
</script>

分析:console.log(this,1111);其中的this,向上找没有找到最近的嵌套的function和方法,一直到window。所以最终指向window

eg:举个最近的嵌套的function和方法 这个函数调用者   例子:

<script>
    var obj = {
        name:'karen',
        say:function(){
            var fn=(a)=>{
                console.log(this,222); //karen 222
                return 100;
            }
            fn(2);
        }
    }
    obj.say();
</script>

分析:箭头函数中 this指向,找离他  最近的 (嵌套的)function /方法   这个函数的调用者,离箭头函数最近的有一个方法say(), ,然后下面有对象调该方法obj.say();,所以this就是指向这个方法的调用者obj对象。所以结果为  karen 222

4.箭头函数写法上与普通函数的区别

01.箭头函数 如果箭头函数的形参只有一个,可以省略参数体小括号,如果代码只有一行可以省略大括号

<script>
    //普通函数
    var f1 = function(a){
    return a;
    }
    f(1);  //1

    //箭头函数 
    var f2 = a => a
    f(10); //10
</script>

 02.当箭头函数没有参数或者有多个参数,要用 () 括起来。

<script>
    var f3 = (a,b) => a+b;
    f3(6,2);  //8

    var f4 = () => a+b;
    f4();
</script>

03.当箭头函数函数体有多行语句,用 {} 包裹起来,表示代码块,当只有一行语句(多行代码就需要写{}和return),并且需要返回结果时,可以省略 {} , 结果会自动返回

<script>
    var f = (a,b) => {
    let result = a+b;
    return result;
    }
    console.log(f(6,6)); // 12
</script>

04.推荐:无论有几个形参和几行代码,全部要写()和{ }

<script>
    var f = () => {
    
    }
</script>

5.箭头函数不可以作为构造函数,也就是不能使用 new 命令,否则会报错 ,普通函数可以

因为this指向问题,很容易箭头函数里面的this不能给创建的对象添加成员,全给window添加了。

6.箭头函数里面不存在 arguments关键字(保存传入的实参)

没有 this、super、arguments 和 new.target 绑定

<script>
    //普通函数
    var f = function(a){
        console.log(arguments);//Arguments(3) [100, 200, 300, callee: ƒ, Symbol(Symbol.iterator): ƒ]
    }
    f(100,200,300);
    //箭头函数
    var f1 =(a)=>{
        console.log(arguments); //rguments is not defined
    }
    f1(100,200,300);
</script>

问题:箭头函数形参数目比实参数目少,但是又想打印出传入的多出的形参 怎么办?

利用剩余运算符(相当于替代了普通函数的arguments)

剩余运算符:只会取出多出的实参,接收实参,并放入数组中。

<script>
    var f = (a,...rest)=>{
        //打印出多余的实参并放到一个数组中 2,3
        console.log(rest); //(2) [2, 3]
    }
    f(1,2,3);
</script>

<script>
    //也可以一个形参都不写,直接写剩余运算符,把实参全部取出来,然后放入一个数组
    var f1 = (...rest)=>{
        console.log(rest); //(3) [1,2, 3]
    }
    f1(1,2,3);
</script>

<script>
    var f2 = (...rest)=>{
        console.log(rest); //[]
    }
    f2();
</script>

注意点:若有形参,剩余运算符只能放在形参之后,不能放在形参之前。若放在形参之前,剩余运算符就把实参全部取了,形参还取什么?所以这样不可。

7.bind()/call() 能改变箭头函数中this指向么? 不能

<script>
    var fn=()=>{
        console.log(this);
    }
    var obj = {name:'karen'};
    fn.call(obj);  //传入obj的意思是想让箭头函数中的this指向obj
                   //但实际还是指向window  不会报错,也改变不了内部的this指向
</script>
<script>
   //普通函数可以bind()
   var arr=[];
   var obj={
        name:'jack',
        fn:function(){   
        console.log(this); //[]  
    }.bind(arr)  //绑定一个数组
   }
   obj.fn(); 
</script>
<script>
   //箭头函数不可以bind()
   var arr=[];
   var obj={
        name:'jack',
       fn:()=>{        //这里注意下箭头函数在对象里面的写法
        console.log(this); //[] 
       }.bind(arr)  //Unexpected token '.' 解析不了
   }
   obj.fn(); 
</script>

8.用箭头函数解决回调函数相关的问题

 不用箭头函数时:

<script> 
    function tool(cb){                                        
        cb();                                                 
    }
    var obj ={                                                
        name:'karen',
        say:function(){
            console.log(this.name);
        },
        makeMoney:function(){
            //var that =this;
            tool(function(){
                console.log(this.name + "赚了钱",111);
            })
        }
    }
    obj.makeMoney();
</script>

分析:目的是要最终打印出 :karen赚了钱 111,注意体会,加与不加this指向,不加this指向window,加了this指向obj  this指向法则:指向离它最近的或者嵌套级别的function/方法 的调用者,如果没有,一直到顶层就是windows

因为用回调函数this指向问题比较难确定,所以用 箭头函数来操作:

<script>                                                      
    // function tool(cb){                                        
    //     cb();                                                 
    // }
    var obj ={                                                
        name:'karen',
        say:function(){
            console.log(this.name);
        },
        makeMoney:function(){
            // //var that =this;
            // tool(function(){
            //     console.log(this.name + "赚了钱",111);
            // })
            tool(()=>{
                console.log(this.name + "赚了钱",111);
            })
        }
    }
    obj.makeMoney();
</script>

分析:箭头函数this指向依旧是离它最近的或者嵌套级别的function/方法 的调用者,如果没有,一直到顶层就是windows,这里,箭头函数中的this,离它最近的function是makeMoney:function(){},该方法的调用者是obj,所以this就指向obj。然后成功输出 karen赚了钱 111

9.箭头函数参数也有默认值

<script>                                                      
    var fn=(a=20)=>{
        console.log(a);
    }
    fn();    //20 不传参数时,用的是默认值  类似于解构赋值
    fn(100); //100 传了参数就是传的参数
</script>

10.注意点:

1.ES6 之前,JavaScript 的 this 对象一直很令人头大,回调函数,经常看到 var self = this 这样的代码,为了将外部 this 传递到回调函数中。那么有了箭头函数,就不需要这样做了,直接使用 this 就行。所以,当我们需要维护一个 this 上下文的时候,就可以使用箭头函数

2.总结:面试题:箭头函数的特点

  • 要有个箭头

  • 箭头的前面是小括号,放形参,只有一个形参的时候可以省略小括号;

  • 箭头的后面是函数体;

  • 如果函数体只有一个语句,没有{},此时的返回值不需要return;

  • 箭头函数里面的this总是指向最靠近的function 内部的this;

  • 对象里面的方法,尽可能不要使用箭头函数;

  • 箭头函数里面没有arguments,可以使用…reset,接收过来就是数组类型,接收的是形参之外的所有的实参;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值