JavaScript 胖箭头函数中的this

在非箭头函数下, this 指向调用其所在函数的对象
箭头函数导致this总是指向函数定义生效时所在的对象


1.png

以前这种情况下,根据“箭头函数”的this,总是指向定义时所在的对象,而不是运行时所在的对象。这句话,我会认为箭头函数的this指向foo,但这是错的。

为什么呢,关键在于”定义时“三个字。我们会理所当然把它和“书写时”等价,但其实这是错的,注意是函数定义生效时。

<body>
<h1> this is a header</h1>
<div class="hh">hh</div>
<div class="hhh">hhh</div>
<div class="hhhh">hhhh</div>
<div class="hhhhh">hhhhh</div>
</body>
<script>
window.onload=function(){
   
   var $=(selector)=>{
    return document.querySelector(selector);
   }

   function zzh(){
    this.id=1;
   }

   zzh.prototype={
    constructor:zzh,
    h:function(){
      console.log(this); //zzh {id: 1}
    },
    hh:function(){
      $('.hh').onclick=function(){
        console.log(this);  //<div class="hh">hh</div>
      }
    },
    hhh:function(){
      var self=this;
     $('.hhh').onclick=function(){
       console.log(this); //<div class="hhh">hhh</div>
       console.log(self);//zzh {id: 1}
      }
     },
    hhhh:function(){
      $('.hhhh').onclick=()=>{console.log(this)} //zzh {id: 1}
     },
    hhhhh:function(){
      $('.hhhhh').onclick=function(){
          console.log(this);
      }.bind(this); //zzh {id: 1}
     }    
   }


   var  z1=new zzh();
   z1.h();
   z1.hh();
   z1.hhh();
   z1.hhhh();
   z1.hhhhh();
}  
</script>

箭头函数中的this继承外围作用域

let person = {
    name: "gard",
    say: () => {
        console.log(this);
        console.log(this.name);
    }
};
person.say();

this的值为window或global对象,this.name的值为undefined或""(空字符串)。


随手记

当我们new 一个对象的时候到底干了什么?

var person1=new Person();

其实就是下面三步
var person1 = {};
person1.__proto__ =Person.prototype;
Person.call(person1);

第一行,我们创建了一个空对象person1。
第二行,我们将这个空对象的__proto__属性指向了Person函数对象prototype成员对象。
第三行,我们将Person函数对象的this指针替换成person1,然后再调用Person函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容