addEventListener中事宜函数的this指向

Update: MDN的文档中关于该题目有更威望的诠释 ?
DOM事宜处置惩罚函数中的 this 《威望指南》中文版455页关于这个题目也有申明,而且提到:IE9之前的
attachEvent()作为函数挪用其
this值是全局(window)对象。

当时想这题目的时刻没去找文档,书也没看细致啊!

运用JS原型封装对象的时刻,绑定事宜我有时会如许写:

var obj = function() {...}

// 将某事宜绑定至某对象e,但事宜函数中上下文坚持为obj
obj.prototype.bindEvn = function(e){
     e.addEventListener(Event,obj.method.bind(this),false)    
}


obj.prototype.method = function(){...}

这里addEventListener中this的指向我不是太清晰, 虽然一直以来都直接用bind设置this的值(毫无疑问地返回了一个绑定了obj对象的函数),然则假如没用bind要领会是种什么状况? 这内里的this指向是挪用addEventListener要领的对象e呢照样obj(假如如许那末我这bind白用了?)
立时做个demo看下究竟啥状况:
我是DEMO
(貌似demo设想得有点略傻?)

//定义一个可见的盒子用于绑定点击事宜
var box = document.getElementById('box');
box.x = 'box'

//设置实行函数的对象属性
function outFunc() {
  this.x = 'outFunc';
  box.addEventListener('click', func, false);
}
outFunc();

function func() {
  console.log(this.x); //输出box 申明该this指向的是挪用addEventListener的对象
}

当用bind设置this值的时刻, this才指向实行函数

function outFunc() {
  this.x = 'outFunc';//给全局对象window.x赋值(相当于赋值全局变量)
  box.addEventListener('click', func.bind(this), false);
}
function func() {
  console.log(this.x); //输出outFunc 运用bind设置this的值
}

实在这内里也触及到了JS的基本观点, 也就是当函数作为要领挪用时,this指向挪用该要领的对象, 当函数作为嵌套函数挪用时, this指向全局对象(非严厉形式下)或许undefined(严厉形式)而不是其外包函数的上下文, 假如对这个观点熟悉清晰了,就能够发明addEventListener的中的事宜函数默许是作为挪用addEventListener对象的要领,假如须要设置this的指向(比方上面的栗子中就运用bind设置this的指向为外包函数的上下文),则可以运用bind()。

这类状况和内联函数中的this指向相似,当this被内联函数挪用时,它的this默许指向监听器地点的DOM元素。这里直接用MDN文档中的栗子:

<button onclick="alert(this.tagName.toLowerCase());">
  Show this
</button> //输出button

在stackoverflow上也有相似题目的议论:
The value of “this” within the handler using addEventListener
关于this值的题目,要多看看MDN的文档:
this

本身着手,饱食暖衣,吃早饭去了~

    原文作者:囧囧
    原文地址: https://segmentfault.com/a/1190000003952832
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞