此关键字的分配

时间:2018-12-06 10:39:42

标签: javascript

我了解到,调用对象的方法时,该方法中的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

为什么这个没用?

2 个答案:

答案 0 :(得分:2)

在第二个示例中,没有用于调用growOneYear()的对象。

您将方法growOneYear复制到新变量(cb)中。这会松开doggrowOneYear之间的链接。然后,您可以将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);