前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >this 指向4 — 事件处理函数中的 this

this 指向4 — 事件处理函数中的 this

作者头像
用户9914333
发布2022-07-22 14:35:13
发布2022-07-22 14:35:13
84600
代码可运行
举报
文章被收录于专栏:bug收集bug收集
运行总次数:0
代码可运行

本文继续讨论 this 指向 问题,今天讨论:

事件处理函数中的 this

文末尾有关于this的面试题,可直接查看

0 1

事件处理函数中的 this

示例1:

代码语言:javascript
代码运行次数:0
复制
<button id="btnTest" onclick="console.log(this)">Test</button>
<button id="btnTest2" onclick="(function(){console.log(this)})()">
Test2</button>

点击结果为:

示例2:

代码语言:javascript
代码运行次数:0
复制
  //场景1
  let btn  = document.getElementById("btnTest");
  btn.onclick = function (){
    console.log(this);
  }
  
  //场景2
  let btn2  = document.getElementById("btnTest2");
  btn2.addEventListener('click',function (){
    console.log(this);
  })
  
  //场景3
  let btn3  = document.getElementById("btnTest3");
  btn3.addEventListener('click',handleClick)
  function handleClick(){
    console.log(this);
  }

结果均为: 触发事件的DOM元素

示例3:

代码语言:javascript
代码运行次数:0
复制
 ;(function (doc){
    let oBtn = doc.getElementById('btnAdd');
    function Plus(a,b){
      this.a = a;
      this.b = b;
      this.init();
    }
    Plus.prototype.init=function (){
      this.bindEvent();
    }
    Plus.prototype.bindEvent = function (){
      oBtn.addEventListener('click',this.handlerBtnClick,false);
    }
    Plus.prototype.handlerBtnClick = function (){
      console.log(this);
      console.log(this.a ,this.b);
    }
    window.Plus = Plus;
  })(document)

  new Plus(3,4);

结果为:

总结 :

事件函数处理内部的this, 总是指向被绑定的DOM元素

0 2

改变函数内部this指向

问题:如何让 handlerBtnClick 内this指向类的实例

方法一:

代码语言:javascript
代码运行次数:0
复制
oBtn.addEventListener('click',this.handlerBtnClick,false);

方法二:

代码语言:javascript
代码运行次数:0
复制
 _self = this;

Plus.prototype.handlerBtnClick = function (){
      console.log(_self );
      console.log(_self .a ,_self .b);
}

0 3

面试题

看了this的各种情况,大家应该比较了解吧,

下面我们就来看一道关于 this 的面试题

以下输出的值,并简述

代码语言:javascript
代码运行次数:0
复制
var foo={
      bar:function(){
           console.log(this)
     }
}
foo.bar()
(foo.bar)()
(foo.bar=foo.bar)()
(foo.bar,foo.bar)()
(false || foo.bar)()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档