Powiązanie tworzy nową funkcję, która zmusi this
wnętrze funkcji do przekazania parametru bind()
.
Oto przykład, który pokazuje, jak użyć bind
do przekazania metody członka, która ma poprawną wartość 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
Który drukuje:
OK clicked
undefined clicked
OK clicked
Możesz również dodać dodatkowe parametry po parametrze 1st ( this
) i bind
przekaże te wartości do pierwotnej funkcji. Wszelkie dodatkowe parametry przekazane później do funkcji powiązanej zostaną przekazane po parametrach powiązanych:
// Example showing binding some parameters
var sum = function(a, b) {
return a + b;
};
var add5 = sum.bind(null, 5);
console.log(add5(10));
Który drukuje:
15
Sprawdź powiązanie funkcji JavaScript, aby uzyskać więcej informacji i interaktywne przykłady.
Aktualizacja: ECMAScript 2015 dodaje obsługę =>
funkcji. =>
funkcje są bardziej zwarte i nie zmieniają this
wskaźnika z zakresu ich definiowania, więc nie trzeba go używać bind()
tak często. Na przykład, jeśli chcesz, aby funkcja Button
od pierwszego przykładu łączyła click
wywołanie zwrotne ze zdarzeniem DOM, poniższe są wszystkie prawidłowe sposoby:
var myButton = {
... // As above
hookEvent(element) {
// Use bind() to ensure 'this' is the 'this' inside click()
element.addEventListener('click', this.click.bind(this));
}
};
Lub:
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() });
}
};
Lub:
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)