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

2022-07-22 14:35:13 浏览数 (1)

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

事件处理函数中的 this

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

0 1

事件处理函数中的 this

示例1:

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

点击结果为:

示例2:

代码语言:javascript复制
  //场景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复制
 ;(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复制
oBtn.addEventListener('click',this.handlerBtnClick,false);

方法二:

代码语言:javascript复制
 _self = this;

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

0 3

面试题

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

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

以下输出的值,并简述

代码语言:javascript复制
var foo={
      bar:function(){
           console.log(this)
     }
}
foo.bar()
(foo.bar)()
(foo.bar=foo.bar)()
(foo.bar,foo.bar)()
(false || foo.bar)()

0 人点赞