实例讲解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); } }