生命周期上下文绑定到函数

时间:2017-09-15 09:51:13

标签: javascript

我问自己是否可以将上下文绑定到函数中。

让我们说,我们有一个全局函数和一个myClass函数:

function myClass() {
  this.iterator = 1;
}

function incrementConcreteIterator() {
  this.iterator++;
}

我现在想在myClass的上下文中调用incrementConcreteIterator,我这样做:

let myClassInstance = new myclass();
incrementConcreteIterator.call(myClassInstance);
incrementConcreteIterator.call(myClassInstance);
//myClassInstance.iterator is now 3

一切正常。我现在的期望是,当我绑定myClassInstance时,incrementConcreteIterator将始终在类上下文中被调用,但它不是。

let myClassInstance = new myclass();
incrementConcreteIterator.bind(myClassInstance);
incrementConcreteIterator();
incrementConcreteIterator();
//myClassInstance.iterator is still 1

有没有办法将上下文绑定到incrementConcreteIterator?

2 个答案:

答案 0 :(得分:1)

bind返回一个绑定了this值(以及可选的其他参数)的新函数,而不是更改原始函数,因此您需要使用它:

function myClass() {
  this.iterator = 1;
}

function incrementConcreteIterator() {
  this.iterator++;
}

let myClassInstance = new myClass();
let myClassInstanceIterator = incrementConcreteIterator.bind(myClassInstance);
myClassInstanceIterator();
myClassInstanceIterator();

console.log(myClassInstance.iterator);

答案 1 :(得分:0)

.bind()会返回一个新函数,您需要将其分配给某个东西。

let myClassInstance = new myclass();
myInstanceIterator = incrementConcreteIterator.bind(myClassInstance);
myInstanceIterator();
myInstanceIterator();
// myClassInstance.iterator is now 3

如果你真的想改变incrementConcreteIterator,你可以这样做:

incrementConcreteIterator = incrementConcreteIterator.bind(myClassInstance);