举一个小栗子:
var obj = {
name:'zs',
sayHello:function(){
setTimeout(function(){
alert(this.name)
},2000)
}
}
obj.sayHello(); //undefined
调用这个对象中的这个函数的时候,里面的seTimeout函数参数中定义的匿名函数,而该匿名函数执行上下文的对象是window,因此this指向的是window对象,而window对象中并没有定义name属性所以输出为undefined
解决方法一:
var obj = {
name:'zs',
sayHello:function(){
setTimeout((function(){
alert(this.name)
}).bind(this),2000)
}
}
obj.sayHello(); // zs
解决方法二
var obj = {
name:'zs',
sayHello:function(){
var that = this;
setTimeout(function(){
alert(that.name)
},2000)
}
}
obj.sayHello(); // zs
注意:使用bind()方法会创新一个新的函数,叫绑定函数,该函数的this被绑定到参数传入的对象
解决方法三:
var obj = {
name:'zs',
sayHello:function(){
setTimeout(()=>
alert(that.name),2000)
}
}
obj.sayHello(); // zs
注意:箭头函数的this值取决于该函数外部非箭头函数的this值(最近一层),如果没有则this值会被设置为全局对象