我了解到,调用对象的方法时,该方法中的this
值将分配给对象本身。
const dog = {
age: 5,
growOneYear: function () {
this.age += 1;
}
};
dog.growOneYear();
dog.age; // 6
这对我来说很有意义。但是,当我以其他方式尝试时,它不起作用:
function invokeTwice(cb) {
cb();
cb();
}
invokeTwice(dog.growOneYear);
dog.age;
// still 6
为什么这个没用?
答案 0 :(得分:2)
在第二个示例中,没有用于调用growOneYear()
的对象。
您将方法growOneYear
复制到新变量(cb
)中。这会松开dog
和growOneYear
之间的链接。然后,您可以将cb()
作为常规函数调用,而无需在方法内部使用对象充当this
。
您在问题中说:
...调用对象的方法时,该方法中的
this
值将分配给对象本身。
上面的陈述是正确的,它解释了为什么当您将growOneYear
调用为cb()
时它不起作用:只有当它以{{1调用时,它才是“对象的方法” }}。如果将其复制到dog.growOneYear()
中并以cb
的形式调用,则它只是一个常规函数;不再使用任何对象来调用它。
您在问题解答中描述的情况甚至在Function.prototype.bind()
的文档中列出:
对于新的JavaScript程序员来说,一个常见的错误是从对象中提取一个方法,然后再调用该函数并期望它使用原始对象作为其
cb()
(例如,在基于回调的方法中使用该方法)码)。但是,如果没有特别注意,通常会丢失原始对象。
this
是解决您问题的方法:
Function.prototype.bind()
答案 1 :(得分:0)
在第二种情况下,您的函数将作为此参数传递给窗口对象,因为您没有调用随任何指定对象传递的cb函数。
如果要与狗对象一起调用,请像下面这样应用apply。
enter code here
const dog = {
age: 5,
growOneYear: function () {
//console.log(this)
this.age += 1;
}
};
dog.growOneYear();
dog.age;
function invokeTwice(cb) {
cb.apply(dog);
cb.apply(dog);
}
invokeTwice(dog.growOneYear);
console.log(dog.age);