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
本身着手,饱食暖衣,吃早饭去了~