JavaScript Function — об'єкт функції, call, apply, bind


У JavaScript функція — це об'єкт: її можна передати в іншу функцію, покласти в масив, додати їй властивість. Клас Function описує саме цей об'єкт.

автор: NagarD

Загальний опис

Головне, що дає ця «об'єктність» — три методи керування контекстом this.

call() викликає функцію, підставляючи потрібний this і передаючи аргументи через кому. apply() робить те саме, але аргументи бере масивом. bind() нічого не викликає — він створює нову функцію з навіки прив'язаним this.

Саме bind() рятує в класичній пастці: передав метод об'єкта як обробник події — і this усередині раптом став елементом, а не об'єктом. Прив'язка це лікує (як і стрілкова функція, яка this не має власного взагалі).

автор: NagarD

Нотатка

Конструктор new Function('return 1') компілює рядок у функцію — це той самий eval у профіль, з тими самими ризиками. У реальному коді він майже ніколи не потрібен.

автор: NagarD

Синтаксис

function fn(a, b) { ... }

властивості

Властивість Опис
name Ім'я функції.
length Кількість оголошених параметрів функції.
prototype Об'єкт-прототип для екземплярів, створених через new.

методи

Метод Опис
call Викликає функцію з заданим this і аргументами через кому.
apply Викликає функцію з заданим this і аргументами масивом.
bind Створює нову функцію з прив'язаним this і, за потреби, аргументами.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
Function 1+ 1+ 1+ 3+ 12+ 5+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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++;
    }
}
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід