JavaRush /Курсы /Модуль 1: Web Core /Методы call, bind и apply

Методы call, bind и apply

Модуль 1: Web Core
22 уровень , 7 лекция
Открыта

8.1 Метод call

Методы call, bind и apply в JavaScript играют ключевую роль в управлении контекстом выполнения функций, позволяя задавать значение this при вызове функций. Эти методы особенно полезны при работе с объектами и функциональным программированием, предоставляя мощные инструменты для гибкого управления кодом. Давайте рассмотрим каждый из них более подробно и разберем различные примеры их использования.

Метод call вызывает функцию с заданным значением this и аргументами, переданными через запятую. Это позволяет нам явно указывать контекст, в котором должна выполняться функция.

Синтаксис:

    
      func.call(thisArg, arg1, arg2 ...);
    
  

Пример:

В этом примере функция greet вызывается с контекстом person, что позволяет ей использовать свойство name объекта person.

JavaScript
    
      function greet(greeting, punctuation) {
        console.log(greeting + ', ' + this.name + punctuation);
      }

      const person = { name: 'John' };

      greet.call(person, 'Hello', '!'); // Output: Hello, John!
    
  

8.2 Метод apply

Метод apply схож с call, но передаёт аргументы в виде массива. Это удобно, когда у нас есть массив аргументов, который мы хотим передать функции.

Синтаксис:

    
      func.apply(thisArg, [argsArray]);
    
  

Пример:

Этот пример аналогичен предыдущему, но аргументы передаются в виде массива.

JavaScript
    
      function greet(greeting, punctuation) {
        console.log(greeting + ', ' + this.name + punctuation);
      }

      const person = { name: 'John' };

      greet.apply(person, ['Hello', '!']); // Output: Hello, John!
    
  

8.3 Метод bind

Метод bind создает новую функцию, которая при вызове устанавливает заданное значение this. Аргументы, переданные в bind, фиксируются в новой функции. Это позволяет создавать функции с постоянным контекстом.

Синтаксис:

    
      const boundFunc = func.bind(thisArg, arg1, arg2 ...);
    
  

Пример:

В этом примере создаётся новая функция boundGreet, которая всегда будет выполняться в контексте объекта person.

JavaScript
    
      function greet(greeting, punctuation) {
        console.log(greeting + ', ' + this.name + punctuation);
      }

      const person = { name: 'John' };

      const boundGreet = greet.bind(person, 'Hello');
      boundGreet('!'); // Output: Hello, John!
    
  

8.4 Подробный разбор использования методов

1. Использование call для наследования методов:

Метод call часто используется для наследования методов одного объекта другим. Это позволяет заимствовать методы и свойства без необходимости явного наследования.

В этом примере конструктор Product вызывается в контексте объекта Food, что позволяет наследовать свойства name и price.

JavaScript
    
      function Product(name, price) {
        this.name = name;
        this.price = price;
      }

      function Food(name, price, category) {
        Product.call(this, name, price);
        this.category = category;
      }

      const cheese = new Food('Cheese', 5, 'Dairy');
      console.log(cheese); // Output: Food { name: 'Cheese', price: 5, category: 'Dairy' }
    
  

2. Использование apply для передачи массива аргументов:

Метод apply удобен, когда мы хотим передать массив аргументов функции, которая принимает отдельные параметры.

В данном случае массив numbers передается функции sum как отдельные аргументы.

JavaScript
    
      function sum(a, b, c) {
        return a + b + c;
      }

      const numbers = [1, 2, 3];
      console.log(sum.apply(null, numbers)); // Output: 6
    
  

3. Использование bind для создания функции с фиксированным контекстом:

Метод bind позволяет создавать функции с постоянным контекстом, что особенно полезно при работе с событиями и обратными вызовами.

Здесь функция getX привязывается к объекту module с помощью bind, что позволяет корректно получать значение x при вызове функции.

JavaScript
    
      const module = {
        x: 42,
        getX: function() {
          return this.x;
        }
      };

      const unboundGetX = module.getX;
      console.log(unboundGetX()); // Output: undefined

      const boundGetX = unboundGetX.bind(module);
      console.log(boundGetX()); // Output: 42
    
  

8.5 Примеры из реальной жизни

Пример использования call для заимствования метода массива:

В этом примере метод forEach массива используется для объекта arguments с помощью call.

JavaScript
    
      function printArguments() {
        Array.prototype.forEach.call(arguments, function(item) {
          console.log(item);
        });
      }

      printArguments(1, 2, 3); // Output: 1, 2, 3
    
  

Пример использования apply для объединения массивов:

Здесь метод push используется для объединения двух массивов с помощью apply.

JavaScript
    
      const array1 = [1, 2, 3];
      const array2 = [4, 5, 6];

      Array.prototype.push.apply(array1, array2);
      console.log(array1); // Output: [1, 2, 3, 4, 5, 6]
    
  

Пример использования bind для создания частичной функции:

Функция double создается с фиксированным первым аргументом 2 с помощью bind.

JavaScript
    
      function multiply(a, b) {
        return a * b;
      }

      const double = multiply.bind(null, 2);
      console.log(double(5)); // Output: 10
    
  
1
Задача
Модуль 1: Web Core, 22 уровень, 7 лекция
Недоступна
Наследование с call
Наследование с call
1
Задача
Модуль 1: Web Core, 22 уровень, 7 лекция
Недоступна
Массив аргументов apply
Массив аргументов apply
1
Опрос
CRUD и работа с API, 22 уровень, 7 лекция
Недоступен
CRUD и работа с API
CRUD и работа с API
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ