对象方法中定义的子函数,子函数执行时this指向哪里?
Javascript 607
这里涉及到三个问题:
- 以下代码中打印的this是个什么对象?
- 这段代码能否实现使myNumber.value加1的功能?
- 在不放弃helper函数的前提下,有哪些修改方法可以实现正确的功能?
var myNumber = {
value: 1,
add: function(i){
var helper = function(i){
console.log(this);
this.value += i;
}
helper(i);
}
}
myNumber.add(1);
解答:this指向window对象,因为当一个函数并非一个对象的属性时,它被当作一个函数来调用,此时this被绑定到全局对象上。
不能实现。
方法1:通过apply方法改变this的指向
方法2:通过call方法,改变this的指向
方法3:把this赋值给一个变量,把这个变量给内部的匿名函数使用。
var myNumber = {
value: 1,
add: function(i){
var helper = function(i){
console.log(this.myNumber);
this.myNumber.value += i;
}
helper(i);
}
}
myNumber.add(1);
//(2)
var myNumber = {
value: 1,
add: function(i){
var helper = function(i){
console.log(this);
this.value += i;
}
helper.apply(myNumber,[i]);
}
}
myNumber.add(1);
//(3)
var myNumber = {
value: 1,
add: function(i){
var helper = function(i){
console.log(this);
this.value += i;
}
helper.bind(myNumber,i)();
}
}
myNumber.add(1);
//(4)
var myNumber = {
value: 1,
add: function(i){
var helper = function(i){
console.log(this);
this.value += i;
}
helper.call(myNumber,i);
}
}
myNumber.add(1);