深入理解ES6中的箭头函数

    前期一直没有理解ES6中的箭头函数,想着干嘛非要写成=>这样的形式,非要省略function。这期内容,本人又重新学习一边,着重详细理解箭头函数。

   在ES6之前,函数中改变this指向,需要依赖于call();apply();bind();其中call()与apply()能调用函数,并且改变this指向,并且call()具有继承的功能,而bind比较特殊,它只能改变this的指向,不能够调用函数,但是它能将函数变成一个新的函数做为参数进行传递,并且需要一个变量接收新的函数。而在ES6中,改变了这一现象。

1、首先我们定义一个正常点的函数,案例中我们使用赋值式的函数,代码片段如下所示:

var test = function(){
        console.log("我是赋值函数,将函数赋值给test变量");
    }
    // 用户可以执行test变量
    test() //控制台打印的结果为   我是赋值函数,将函数赋值给test变量。

/接下来我们说箭头函数,首先定义好变量,将其赋值给变量,直接省略function这个关键字,后面直接跟上=>,后面再跟上{},写成代码格式如下所示:

var test1 =()=>{
        console.log("我是箭头函数的写法");
    }

    test1()

上面的两个代码块都能执行,有都能调用。

2、接下来我们来讲解下箭头函数的特点,以及箭头函数有什么注意的地方。

2.1 箭头函数中小括号可以省略

()可以省略,但是得有条件,下面我将代码简化过程进行演示

 正常情况下,我们定义一个函数

var test = function(){
        console.log("我不是简写的函数");
      }

第一次简化,省略去关键字function

var test = () =>{
         console.log("我省略了关键字function");
      }

要想省略()是有条件的,如果小括号中接收的是一个形参,而且参数只有一个的情况下,小括号是可以省略的,直接书写形参,代码如下:

  var test = (a) =>{
        console.log(111,a);
      }
    //   简化省略小括号
      var test = a =>{
        console.log("我是省略小括号后的",a);
      }
    
       test("箭头函数省略小括号")

控制台输出结果为

注意,如果函数参数中有两个或多个的时候,小括号是不能省略的,代码块如下所示,编辑时候,代码就开始出错了 ,如下图所示

 加上小括号,代码就不会报错提示:

总结:只有一个形参 的时候,小括号才能省略。

2.2箭头函数中的{}是否可以省略?

省略{}后的方式如下图所示:

注意:上面我们提到过,当返回值是一句代码或者只有返回值的时候可以省略{},但是在实际开发过程中,我们可能遇到函数的返回值可能是一个对象,那么此时该如何省略{}呢?

上面代码中,我们定义了一个函数,函数的返回值是一个对象,打印结果为对象的key:value, 我们要简写省略{},此时代码打印结果为undefined,这是因为浏览器不能识别箭头函数后面的{},究竟是函数中自带的花括号还是属于对象本身的{},代码如下所示:

 为了解决这样的情况,当箭头函数返回值是一个对象的时候,需要在对象{}前加()即可,写法如下图代码

3、箭头函数的第三个特点没有arguments

 在箭头函数中没有arguments,在前面我们并没有说明这个特殊的数组,在这里我们说明一下

  首先写一个函数,这个函数是赋值式的或者声明式的都可以的,代码如下所示:

上诉代码打印结果是没有任何问题的,假设函数中,不写形参的情况下,我们调用该函数,并传入实参,该如何获取到传入的实参值呢?如果函数中没有形参是没办法获取到传入的实参的。

在函数的内部,函数本身自建了一个特殊的变量叫arguments,用户无需定义,打印结果是一个数组结构(称为伪数组)

 

 

 上面的代码中是函数内部自建的一个特殊变量,能够在函数没有形参的特殊情况下,能够拿到调用函数传入的实参。

当然,有些初入行的小伙伴可能会想,如何将arguments伪数组转换成一个真数组呢?

此时只需要使用Array.from(arguments),它能够强行的将一个伪数组转换成一个真实的数组

 

 打印结果显示为一个真正的数组形式。

上面的讲解,是对Arguments知识点做一个讲解,接下来我们回归到箭头函数中,在箭头函数中,是没有arguments的,代码如下所示:

上述代码中,是在箭头函数中,我们使用arguments,打印结果报错,所以拿不到arguments,如果一定非要拿到调用传入的实参,那么只能在箭头函数中写入形参。 

4、箭头函数中的this指向问题

    箭头函数this的指向问题,在箭头函数中this是父级作用域的。

我们继续案例方式讲解,我们首先创建一个输入框,获取到输入框中每次输入的内容。

 这里面的this指向的为输入框每次输入的值,

接下来我们在上述代码块中,再加入一个定时器,我们需要延时1s中之后,将其结果打印出来,代码如下:

在定时器中的this指向结果显示为window ,当我们写成this.value时候,打印的结果则为undefined

那小伙伴一定有疑惑,为什么this.value打印的结果就是undefined,而不是文本框输入的内容呢?

前面代码中我们已经演示过了,在定时器函数中,我们打印this确实是指向window对象的,但是我们展开window对象里面却没有value这个属性,所有当this.value时候,打印结果为undefined。

在没有学习ES6之前,我们解决上述问题获取到value值的时候,我们一般都是定义一个临时变量that,先把定时器函数外部的this暂时存一份,代码演示如下所示:

 

举上面这个例子,是想说明,当我们有时候需要访问到当前这个函数外面的作用域的时候,就可以将外面的函数的this暂时存一下。

但是当我们使用箭头函数的时候,就没有那么麻烦,不需要再定义变量了,因为此时this指向的是函数外面的这个函数。箭头函数书写代码如下图所示:

在浏览器端输入内容,也能正常获取到输入的值。

总结:箭头函数中,this是当前函数外面父级的作用域内的。

以上就是本人重学后对箭头函数的理解,如有不足之处,还请大佬批评指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值