美文网首页
关于ES6中箭头函数this和普通函数this指向的问题理解

关于ES6中箭头函数this和普通函数this指向的问题理解

作者: 浮生若梦_5094 | 来源:发表于2019-04-24 17:18 被阅读0次

    最近在看ES6,发现对箭头函数的this和普通函数的this理解不是很明确,花了一些时间,将自己理解的思路整理一下,如有错误,欢迎指正:

    先说一下普通函数中的this,普通函数中的this表示调用此函数时的对象,如下例:

    var x=11;
    var obj={
      x:22,
      say:function(){
        console.log(this.x)
      }
    }
    obj.say();
    //console.log输出的是22
    

    调用say函数的是对象obj,所以this指代对象obj,输出的就是obj对象里的x值,即22。

    然后是箭头函数中的this,资料上说的箭头函数内部是没有this的,也就是说,箭头函数里面的this会继承自外部的this,下面有个例子,用来详细说明下:

    var x=11;
    var obj={
     x:22,
     y:this,//window
     say:()=>{
       console.log(this.x);
     }
    }
    obj.say();
    //输出的值为11
    console.log(obj.y);
    //输出的值为window对象
    

    obj对象中的this指代的就是window,也就是全局环境,因为箭头函数中的this就会就近找到上一个对象中this所指代的对象,从以上例子可以看出来,obj内部属性y就为obj内部this指代的对象,输出是window。

    为了加深下印象,我们再从两个例子说明下普通函数和箭头函数 this的指向问题,这是普通函数:

    var a=11
    function test1(){
      this.a=22;
      let b=function(){
        console.log(this.a);
      };
      b();
    }
    var x=new test1();
    //输出11
    

    为什么会输出11?因为普通函数中的this指向的是调用它的对象,如果没有直接调用对象,会指向undefined或者window,一般都会指向window,在严格模式下才会指向undefined。上述的例子中,并没有明确的调用对象,而普通函数中的this并不会向上继续找对象,所以直接返回window。

    这是箭头函数:

    var a=11;
    function test2(){
      this.a=22;
      let b=()=>{console.log(this.a)}
      b();
    }
    var x=new test2();
    //输出22
    

    箭头函数中会往上寻找this,直到找到所代表的this为止。例子中,构造函数被实例化成为一个对象x,那x中的this指代的就是对象x本身,所以箭头函数this就代表x对象,x对象内部的a值为22,所以输出22。

    再进行总结一下,箭头函数中的this是在声明中就定义好了的,而普通函数中的this则是在调用时定义好的。

    现在我们来解释箭头函数的this,其实箭头函数里是没有this的,而普通函数的是有this的。

    但是普通函数在定义的时候并不知道自己的this要指向哪里,所以在被调用的时候普通函数里的this会指向调用它的那个对象。

    而箭头函数因为本身没有this,它会直接绑定到它的词法作用域内的this,也就是定义它时的作用域内的this值。
    通俗点说 就是它会直接绑定到它父级的执行上下文里的this。

    相关文章

      网友评论

          本文标题:关于ES6中箭头函数this和普通函数this指向的问题理解

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