Сводка
Метод call()
вызывает функцию с указанным значением this
и индивидуально предоставленными аргументами.
Примечание: хотя синтаксис этой функции практически полностью идентичен функции apply()
, фундаментальное различие между ними заключается в том, что функция call()
принимает список аргументов, в то время, как функция apply()
- одиночный массив аргументов.
Синтаксис
fun.call(thisArg[, arg1[, arg2[, ...]]])
Параметры
-
thisArg
-
Значение
this
, предоставляемое для вызова функцииfun
. Обратите внимание, чтоthis
может не быть реальным значением, видимым этим методом: если метод является функцией в нестрогом режиме, значенияnull
иundefined
будут заменены глобальным объектом, а примитивные значения будут упакованы в объекты. -
arg1, arg2, ...
- Аргументы для объекта.
Описание
Вы можете присваивать различные объекты this
при вызове существующей функции. this
ссылается на текущий объект, вызвавший объект. С помощью call
вы можете написать метод один раз, а затем наследовать его в других объектах, без необходимости переписывать метод для каждого нового объекта.
Примеры
Пример: использование call
для связи конструкторов объекта в цепочку
Вы можете использовать метод call
для объединения в цепочку конструкторов объекта, как в Java. В следующем примере для объекта продукта Product
объявлен конструктор с двумя параметрами, названием name
и ценой price
. Продукт инициализирует свойства name
и price
, а специализированные функции определяют ещё категорию category
.
function Product(name, price) { this.name = name; this.price = price; if (price < 0) { throw RangeError('Нельзя создать продукт ' + this.name + ' с отрицательной ценой'); } return this; } 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
не является острой необходимостью, но мы делаем это в целях объяснения.
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); }
Спецификации
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 3-е издание. | Стандарт | Изначальное определение. Реализована в JavaScript 1.3. |
ECMAScript 5.1 (ECMA-262) Определение 'Function.prototype.call' в этой спецификации. |
Стандарт | |
ECMAScript 6 (ECMA-262) Определение 'Function.prototype.call' в этой спецификации. |
Кандидат в рекомендации |
Совместимость с браузерами
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | (Да) | (Да) | (Да) | (Да) | (Да) |
Возможность | Android | Chrome для Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | (Да) | (Да) | (Да) | (Да) | (Да) | (Да) |