Function.prototype.call()
=========================

Сводка
------

Метод **`call()`** вызывает функцию с указанным значением `this` и индивидуально предоставленными аргументами.

**Примечание:** хотя синтаксис этой функции практически полностью идентичен функции `apply()`, фундаментальное различие между ними заключается в том, что функция `call()` принимает **список аргументов**, в то время, как функция `apply()` **- одиночный массив аргументов**.

Синтаксис
---------
```

fun.call(thisArg[, arg1[, arg2[, ...]]])
```

### Параметры

`thisArg`

Значение `this`, предоставляемое для вызова функции *`fun`*. Обратите внимание, что `this` может не быть реальным значением, видимым этим методом: если метод является функцией в нестрогом режиме (en-US), значения `null` и `undefined` будут заменены глобальным объектом, а примитивные значения будут упакованы в объекты.

`arg1, arg2, ...`

Аргументы для объекта.

Описание
--------

Вы можете присваивать различные объекты `this` при вызове существующей функции. `this` ссылается на текущий объект, вызвавший объект. С помощью `call` вы можете написать метод один раз, а затем наследовать его в других объектах, без необходимости переписывать метод для каждого нового объекта.

Примеры
-------

### Пример: использование `call` для связи конструкторов объекта в цепочку

Вы можете использовать метод `call` для объединения в цепочку конструкторов объекта, как в Java. В следующем примере для объекта продукта `Product` объявлен конструктор с двумя параметрами, названием `name` и ценой `price`. Продукт инициализирует свойства `name` и `price`, а специализированные функции определяют ещё категорию `category`.


```js
function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0) {
    throw RangeError(
      "Нельзя создать продукт " + this.name + " с отрицательной ценой",
    );
  }
}

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

Food.prototype = Object.create(Product.prototype);

function Toy(name, price) {
  Product.call(this, name, price);
  this.category = "игрушка";
}

Toy.prototype = Object.create(Product.prototype);

var cheese = new Food("фета", 5);
var fun = new Toy("робот", 40);
```

### Пример: использование `call` для вызова анонимной функции

В этом чисто искусственном примере, мы создаём анонимную функцию и используем `call` для вызова её на каждом элементе массива. Главная задача анонимной функции здесь — добавить функцию печати в каждый объект, способную напечатать правильный индекс объекта в массиве. Передача объекта в качестве значения `this` не является острой необходимостью, но мы делаем это в целях объяснения.


```js
var animals = [
  { species: "Лев", name: "Король" },
  { species: "Кит", name: "Фэйл" },
];

for (var i = 0; i < animals.length; i++) {
  (function (i) {
    this.print = function () {
      console.log("#" + i + " " + this.species + ": " + this.name);
    };
    this.print();
  }).call(animals[i], i);
}
```

Спецификации
------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-function.prototype.call |

Совместимость с браузерами
--------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Смотрите также
--------------

* `Function.prototype.bind()`
* `Function.prototype.apply()`