this是js的一个关键字,随着函数使用场合不同,this的值会发生变化,但是this总有一个原则,就是this值的是调用函数的那个对象,this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁。
This绑定是js中最常出现错误的因素:
Eg:
let PageHander = {
id = '123456',
init:function(){
document.addEventListener('click',function(event){
this.doSomething(event.type);//报错:this.doSomething is not a function
},false);
},
doSomething:function(type){
console.log(type+" "+this.id);
}
};
PageHander.init();
对象PageHander的设计初衷是用来处理页面上的交互,实际上因为this绑定的是事件目标对象的引用,这个代码中实际上是document,而没有绑定PageHander,并且document中并没有this.doSomething方法,所以无法正常执行。
解决方法1:使用bind函数修改this.doSomething
init:function(){
document.addEventListener('click',(function(event){
this.doSomething(event.type);
}).bind(this),false);
}
解决方法2 :使用ES6箭头函数,箭头函数的this指向父执行上下文里的this
init:function(){
document.addEventListener('click',
event => this.doSomething(event.type),false);
},
1)、如果一个函数中有this,但是它没有被上一级的对象所调用,那么this就指向window
2)、如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象
3)、如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的函数所调用,this指向的也只是它上一级的对象
4)、如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。