在嵌套函数里,this的指向已经不是那么的明朗了。
看下面一段代码。
var obj = {
name: 'Jane',
friends: [ 'Tarzan', 'Cheeta' ],
loop: function () {
'use strict';
this.friends.forEach(
function (friend) {
console.log(this.name+' knows '+friend);
}
);
}
};
obj.loop();//Cannot read property 'name' of undefined
这里就直接报错了。
至于为什么,直接看下面一段代码。
var obj = {
name: 'Jane',
friends: [ 'Tarzan', 'Cheeta' ],
loop: function () {
'use strict';
console.log(this);.//Object {name: "Jane", friends: Array[2]}
this.friends.forEach(
function (friend) {
console.log(this);//undefined
console.log(this.name+' knows '+friend);
}
);
}
};
obj.loop();
可以看出来,因为嵌套的原因,嵌套函数里的this已经没有指向任何对象了。解决这个问题,有三个方法。
1:在进入嵌套函数前,将当前的this保存在一个变量中。
var obj = {
name: 'Jane',
friends: [ 'Tarzan', 'Cheeta' ],
loop: function () {
'use strict';
var that = this ;
this.friends.forEach(
function (friend) {
console.log(that.name+' knows '+friend);
}
);
}
};
obj.loop();//这样可以正常输出
2:使用bind().
var obj = {
name: 'Jane',
friends: [ 'Tarzan', 'Cheeta' ],
loop: function () {
'use strict';
this.friends.forEach(
function (friend) {
console.log(this.name+' knows '+friend);
}.bind(this)
);
}
};
obj.loop();//这样可以正常输出
3:使用forEach的callback,详情请看 Examination Methods
var obj = {
name: 'Jane',
friends: ['Tarzan', 'Cheeta'],
loop: function() {
'use strict';
this.friends.forEach(function(friend) {
console.log(this.name + ' knows ' + friend);
}, this);
}
};
obj.loop();
有任何问题可以跟我留留言:decadecode@foxmail.com