2017-09-15 27 views
-1

我問自己是否有可能將上下文綁定到函數的所有時間。生命週期綁定到功能

比方說,我們有一個全球性的功能和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?

回答

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);

0

.bind()返回一個新的函數,你需要將它分配給某個東西。

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

如果你真的想改變incrementConcreteIterator你可以這樣做:

incrementConcreteIterator = incrementConcreteIterator.bind(myClassInstance);