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

箭头函数与普通函数的区别是什么?构造函数可以使用new生成实例,那么箭头函数可以吗?为什么?

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

  1. 箭头函数语法上比普通函数更加简洁(ES6中每一种函数都可以使用形参赋默认值和剩余运算符)。
  2. 箭头函数没有自己的this,它会捕获自己在定义时(注意,是定义时,而不是调用时)所处上下文的this,并继承这个值(使用call/apply等任何方式都无法改变this的指向)所以,箭头函数中的this指向在它被定义的时候就已经确定,之后永远也不会变。
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    let obj = { name: "Mike"}
    function fn1() {
     console.log(this)
    }
    fn1.call(obj) //输出结果:this指向obj
    let fn2 = () => {
     console.log(this)
    }
    fn2.call(obj) //输出结果哦:this仍然指向window
    
  3. 箭头函数中没有arguments(类数组),只能基于…arg获取传递的参数集合(数组)
    代码如下:
    1
    2
    3
    4
    5
    
    let fn = (...arg) => {
     console.log(arg)//输出结果:[10, 20, 30]
     //如果直接console.log(arguments),会报错
    }
    fn(10, 20, 30)
    
  4. 箭头函数不能作为构造函数,不能使用new(因为:箭头函数没有this,其中最重要是也没有prototype)


  • PS:回调函数:把一个函数B作为实参传递给另外一个函数A,函数A在执行时,可以把传进来的函数B在函数A里面执行
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    function each(arr, callBack){
      for(let i = 0; i < arr.length; i++){
          let flag = callBack.call(arr, arr[i], i)//首先使用call方法改变this指向,再用flag接收回调函数返回的结果,如果是false,结束循环(因此可以用来控制当前循环结束与否)
          if(flag === false){
              break;
          }
      }
    }
    each([10,20,30,40], callBack(item, index){
      //在函数each里面通过call方法改变回调函数callBack的this指向,现在this指向原始操作数组,即arr
      if(index > 1){
          return false
      }
    })
    


-->