Bind crea una nuova funzione che forzerà l' thisinterno della funzione a essere il parametro passato bind().
Ecco un esempio che mostra come utilizzare bindper passare un metodo membro che ha il corretto this:
var myButton = {
content: 'OK',
click() {
console.log(this.content + ' clicked');
}
};
myButton.click();
var looseClick = myButton.click;
looseClick(); // not bound, 'this' is not myButton - it is the globalThis
var boundClick = myButton.click.bind(myButton);
boundClick(); // bound, 'this' is myButton
Che stampa:
OK clicked
undefined clicked
OK clicked
È inoltre possibile aggiungere parametri aggiuntivi dopo il primo thisparametro ( ) e bindpassare tali valori alla funzione originale. Eventuali parametri aggiuntivi in seguito passati alla funzione associata verranno passati dopo i parametri associati:
// Example showing binding some parameters
var sum = function(a, b) {
return a + b;
};
var add5 = sum.bind(null, 5);
console.log(add5(10));
Che stampa:
15
Dai un'occhiata al bind della funzione JavaScript per maggiori informazioni ed esempi interattivi.
Aggiornamento: ECMAScript 2015 aggiunge il supporto per le =>funzioni. =>le funzioni sono più compatte e non cambiano il thispuntatore dal loro ambito di definizione, quindi potrebbe non essere necessario utilizzarle bind()con frequenza. Ad esempio, se si desidera attivare una funzione Buttondal primo esempio per collegareclick callback a un evento DOM, i seguenti sono tutti modi validi per farlo:
var myButton = {
... // As above
hookEvent(element) {
// Use bind() to ensure 'this' is the 'this' inside click()
element.addEventListener('click', this.click.bind(this));
}
};
O:
var myButton = {
... // As above
hookEvent(element) {
// Use a new variable for 'this' since 'this' inside the function
// will not be the 'this' inside hookEvent()
var me = this;
element.addEventListener('click', function() { me.click() });
}
};
O:
var myButton = {
... // As above
hookEvent(element) {
// => functions do not change 'this', so you can use it directly
element.addEventListener('click', () => this.click());
}
};
select = document.querySelector.bind(document)