ES6之箭头函数

什么是箭头函数

提起箭头函数,我们不免不想,普通函数用的好好的,为什么es6新增了箭头函数?箭头函数的语法是什么?与普通函数对比,有哪些区别?接下来,就让我们一起康康吧

起因:es5中如果函数中嵌套或调用其他的函数,在控制台中就会出现 ...is not a function的报错,这时就是由于this的指向的问题

诞生的原因:箭头函数的出现就是为了解决es5中的this指向的问题

注意:值得一提的是,箭头函数中没有this,它的this来自父级上下文,并且永远指向父级上下文;

let obj={

  fn:fucntion(){
  
    console.log(this) //this指向的是obj
   }

  fn1:()=>{
   
    console.log(this)//this指向的是window,window就是它的父级上下文
  }

}
obj.fn()  //普通函数,谁调用this指向谁
obj.fn1()//访问对象中的fn1属性,得到的是一个箭头函数,前面没人调用的话,就指向window

箭头函数的this并不会在调用的时候被改变,因为箭头函数在声明的时候,this指向就已经被永久的确定了,这也是对上面的注意点的进一步解释


箭头函数的语法

1.箭头函数只有一个参数的时候,可以省略形参参数的()

//普通函数
fucntion fn(data){
   return data
}
//箭头函数
//只需要返回一个数据,并且这个数据时函数的参数
var fn=data=>data

2.箭头函数只有一句代码的时候,可以省略{}

3.箭头函数有且只有一句代码的时候,可以省略return;箭头函数会直接将这句代码的执行结果作为返回值

//普通函数
function fn(a,b){
  return a+b
}
//箭头函数,只返回一个简单的逻辑语句
var fn=(a,b)=>a+b

4.常规写法

var fn=(形参1,...形参)=>{函数体}

JS中的this指向

1.方法中,谁调用,this指向谁(.前是谁,this指向谁).前默认window
2.如果没有人调用时,this默认指向window
3.构造函数中的this;指向的是通过这个构造函数创建出来的实例;如果是直接执行的话,指向的是window
  构造函数---ES5中的类
  普通函数和构造函数的区别: 构造函数首字母需要大写
  构造函数上的方法 写在构造函数的prototype上面
4.强制改变this的指向
  call(this的指向,function的参数)//传入的参数,以逗号的形式隔开 
  apply(this指向,function的参数)//传入的参数,以数组的形式进行传参
  bind()本身不执行要改变this指向的函数,因为返回的是改变this指向的新方法,需要手动调用 //要想函数执行 在bind()后面加()

箭头函数和普通函数的区别

1.箭头函数是匿名函数,不能作为构造函数,不能使用new(否则报出的错为:fn is not a constructor)
2.箭头函数没有原型属性
3.箭头函数没有arguments(参数集合),可以使用展开运算符...(若在箭头函数fn里面使用arguments,就会报以下错:arguments is not defined at fn)
4.箭头函数不能通过call() apply() bind()方法,改变this指向,但是能够正常传参
5.箭头函数中没有this,它的this来自父级上下文 并且永远指向父级上下文

arguments

arguments是一个参数集合,也是一个伪数组,当普通函数中要接收的参数很多时,可以直接使用arguments接收所有的形参

既然提到了伪数组,那不妨大家一起探讨以下我们平时常见的伪数组又有那些呢?

常见的伪数组有:

1.document.getElementsByTagName和document.childNodes,返回NodeList对象的都是伪数组。 2.function的arguments对象。

3.上传文件时选择的file对象也是伪数组。

伪数组的特点:

1、伪数组是一个对象。

2、这个对象必须要有length属性。且必须是number类型。

3、如果这个对象的length不为0,那么必须要有按照下标存储的数据。

4、伪数组不可以使用数组中的方法(.forEach)。

5、但是伪数组的长度不可变。真数组的长度是动态可变的。

6.伪数组的[[Prototype]]: Object 真数组的[[Prototype]]: Array

如果伪数组要使用真数组中的一些方法,就要想办法转化为真数组

两种方式如下:

1. Array.from(数组名)
2. Array.prototype.slice.call(数组名)// 此法的this指向的是 实例后的对象

//实现过程

Array.prototype.slice=function(index1,index2){ 
   
   let newArr=[]  
  
   for(let i=index1;i<index2;i++){ 
       
      newArr.push(this[i])   
 }  
 
 return newArr
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值