Bind crea una nuova funzione che forzerà l' this
interno della funzione a essere il parametro passato bind()
.
Ecco un esempio che mostra come utilizzare bind
per 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 this
parametro ( ) e bind
passare 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 this
puntatore dal loro ambito di definizione, quindi potrebbe non essere necessario utilizzarle bind()
con frequenza. Ad esempio, se si desidera attivare una funzione Button
dal 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)