你不知道的箭头函数

251 阅读2分钟

什么是箭头函数

箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或new.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数 引用参考MDN

function (a,b){
    return a+b
}

//上面函数可以用箭头函数简写为

(a,b) => a+b

箭头函数实际就是个匿名函数,简化了函数的定义,在只有一个参数和一条返回语句时 function return以及{}都可以省略.多个参数或者多条语句时括号和花括号就不可以省略了.

箭头函数的this

箭头函数是没有this的,准确的说是它没有自己的this,它的this是根据上下文继承来的. 箭头函数的定义可不只是简简单单的简化代码,它更多的是被用来改变this的行为特性.

  var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };

    }

  };

  alert(object.getNameFunc()());
  
  ---------------------------------
    var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

  alert(object.getNameFunc()());

上面是我们在闭包学习中抄来的一段代码.我们看第一段,普通函数调用this会指向全局window,所以运行this.name的结果自然就是The window.第二段同样是普通函数,但是函数最开始是通过对象的方法调用object.getNameFunc()(),此时this指向的是调用它的对象object,然后通过缓存将this赋给that,所以最后运行的时候就是objectname了.第二段代码可以用箭头函数更加方便的写出来.

    var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return () => this.name

    }

  };

  alert(object.getNameFunc()());

箭头函数中的闭包

箭头函数也是可以使用闭包的.

//一个闭包
function foo(){
    var i = 0
    return function(){
        return i++
    }
}
var a = foo()
a()
a()
a()

//通过箭头函数可以改写成

var foo = (i = 0 )=> () => i++
var a = foo()
a()
a()
a()

箭头函数中的递归

例如给定一个数字,我们用递归求它的阶层,3的话就是123

function fac(n){
    if(n<=0){
        return 1
    }else{
        return n*fac(n-1)
    }
}

上面为一个普通的递归求阶乘的函数,我们可以用箭头函数改写为下

var fac = n => {
    if(n<=0){
        return 1
    }else{
        return n*fac(n-1)
    }
}

我们可以合理的运用三元运算使代码更加优雅

var fac = n => (n<=0? 1 : n*fac(n-1))

不适用的

  • 由于箭头函数本身没有this,所以对于call,apply方法无法修改this.
  • 箭头函数不能使用new,会抛出错误.
  • 箭头函数没有prototype属性.