JavaScript Function — об'єкт функції, call, apply, bind
У JavaScript функція — це об'єкт: її можна передати в іншу функцію, покласти в масив, додати їй властивість. Клас Function описує саме цей об'єкт.
Загальний опис
Головне, що дає ця «об'єктність» — три методи керування контекстом this.
call() викликає функцію, підставляючи потрібний this і передаючи аргументи через кому. apply() робить те саме, але аргументи бере масивом. bind() нічого не викликає — він створює нову функцію з навіки прив'язаним this.
Саме bind() рятує в класичній пастці: передав метод об'єкта як обробник події — і this усередині раптом став елементом, а не об'єктом. Прив'язка це лікує (як і стрілкова функція, яка this не має власного взагалі).
- Нотатка
-
Конструктор
автор: NagarDnew Function('return 1')компілює рядок у функцію — це той самийevalу профіль, з тими самими ризиками. У реальному коді він майже ніколи не потрібен.
Синтаксис
function fn(a, b) { ... }
властивості
| Властивість | Опис |
|---|---|
| name | Ім'я функції. |
| length | Кількість оголошених параметрів функції. |
| prototype | Об'єкт-прототип для екземплярів, створених через new. |
методи
| Метод | Опис |
|---|---|
| call | Викликає функцію з заданим this і аргументами через кому. |
| apply | Викликає функцію з заданим this і аргументами масивом. |
| bind | Створює нову функцію з прив'язаним this і, за потреби, аргументами. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| Function | 1+ | 1+ | 1+ | 3+ | 12+ | 5+ |
| Переглядач | ||||
|---|---|---|---|---|
| Function | yes | yes | yes | yes |
Приклади
+ запропонувати свій приклад у пісочниці
call, apply і bind: три способи керувати this.
function greet(greeting) {
return greeting + ', ' + this.name;
}
const user = { name: 'Іван' };
console.log(greet.call(user, 'Привіт')); // 'Привіт, Іван'
console.log(greet.apply(user, ['Вітаю'])); // аргументи масивом
// bind не викликає — він створює нову функцію
const hello = greet.bind(user, 'Добрий день');
console.log(hello()); // 'Добрий день, Іван'
// класична пастка: this загубився в обробнику
class Counter {
constructor() {
this.count = 0;
// без bind тут this буде кнопкою, а не Counter
button.addEventListener('click', this.increment.bind(this));
}
increment() {
this.count++;
}
}
Коментарі
Коментарів ще немає — будьте першим!