美文网首页
箭头函数和普通函数的区别

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

作者: Marshall3572 | 来源:发表于2021-04-10 14:48 被阅读0次

    定义:箭头函数没有function关键字,而是一个类似箭头的函数。

    var a = () => {
        return 1;
    }
    

    等价于

    function a(){
        return 1;
    }
    

    区别:

    • 箭头函数作为匿名函数,是不能作为构造函数的,不能使用new
    var A = () => {
        return 1;
    }
    var a = new A(); //TypeError: A is not a constructor
    
    • 箭头函数不绑定arguments,取而代之用rest参数…解决
    function A(a){
      console.log(arguments); //[object Arguments] {0: 1}
    }
    
    var B = (b)=>{
      console.log(arguments); //ReferenceError: arguments is not defined
    }
    
    var C = (...c)=>{ //...c即为rest参数
      console.log(c); //[3]
    }
    A(1);
    B(2);
    C(3);
    
    • 箭头函数会捕获其所在上下文的this,作为自己的this值
    var obj = {
      a: 10,
      b: function(){
        console.log(this.a); //10
      },
      c: function() {
         return ()=>{
               console.log(this.a); //10
         }
      }
    }
    obj.b(); 
    obj.c()();
    
    • 箭头函数当方法使用的时候没有定义this绑定
      这句话是MDN里面写的,但是我觉得这条和上条其实是一条,还是捕获所在的上下文,比如下面这个例子:b是一个箭头函数,然后它的 this是指向window,这是为什么呢,因为箭头函数捕获的是obj{}这个对象的环境,然后这个环境的this指向的是window,就相当于上一条的例子:在c方法里面return的那个箭头函数捕获的是c:function(){}这个环境的this,而这个环境的this是obj,这样是不是就清晰明了了
    var obj = {
      a: 10,
      b: () => {
        console.log(this.a); //undefined
        console.log(this); //window
      },
      c: function() {
        console.log(this.a); //10
        console.log(this); //obj{...}
      }
    }
    obj.b(); 
    obj.c();
    
    • 使用call()和apply()调用
      通过 call() 或 apply() 方法调用一个函数时,只是传入了参数而已,对 this并没有什么影响
    var obj = {
      a: 10,
      b: function(n){
        var f = (v) => v + this.a;
        return f(n);
      },
      c: function(n) {
        var f = (v) => v + this.a;
        var m = {a:20};
        return f.call(m,n);
      }
    }
    
    console.log(obj.b(1)); //11
    console.log(obj.c(1)); //11
    
    • 箭头函数没有原型属性
    var a = (){
        return 1;
    }
    
    function b(){
        return 2;
    }
    
    console.log(a.prototype); // undefined
    console.log(b.prototype); // object{...}
    

    对于函数的this指向问题,我总结了下面两句话:

    1. 箭头函数的this永远指向其上下文的 this,任何方法都改变不了其指向,如call(), bind(), apply()
    2. 普通函数的this指向调用它的那个对象

    相关文章

      网友评论

          本文标题:箭头函数和普通函数的区别

          本文链接:https://www.haomeiwen.com/subject/jyhnkltx.html