实例讲解JavaScript中的this指向错误解决方法
看如下对象定义:
'usestrict'
varjane={
name:‘Jane',
display:function(){
retrun'Personnamed'+this.name;
}
};
这样能正常调用
jane.display();
下面的调用会出错:
varfunc=jane.display; func()
TypeError:Cannotreadproperty'name'ofundefined
因为,this指向已经改变,正确的方式如下:
varfunc2=jane.display.bind(jane); func2()
'PensonnamedJane'
所有函数都有其特殊的this变量,如下面的forEach
varjane={
name:'Jane',
friends:['Tarzan','Cheeta'],
sayHiToFriends:function(){
'usestrict';
this.friends.forEach(function(friend){
//'this'isundefinedhere
console.log(this.name+'sayshito'+friend);
});
}
}
调用sayHiToFriends会产生一个错误:
jane.sayHiToFriends()
TypeError:Cannotreadproperty'name'ofundefined
解决方案一:将this保存在不同的变量中
varjane={
name:'Jane',
friends:['Tarzan','Cheeta'],
sayHiToFriends:function(){
'usestrict';
varthat=this;
this.friends.forEach(function(friend){
console.log(that.name+'sayshito'+friend);
});
}
}
解决方案二:利用forEach的第二个参数,它可以给this指定一个值
varjane={
name:'Jane',
friends:['Tarzan','Cheeta'],
sayHiToFriends:function(){
'usestrict';
this.friends.forEach(function(friend){
console.log(this.name+'sayshito'+friend);
},this);
}
}