Function.prototype.call()
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на множестве устройств и версий браузеров. Она доступна во всех браузерах с июля 2015 года.
Метод call() экземпляра Function вызывает эту функцию с заданным значением this и аргументами, передаваемыми индивидуально.
Попробуйте
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = "food";
}
console.log(new Food("cheese", 5).name);
// Expected output: "cheese"
Синтаксис
call(thisArg) call(thisArg, arg1) call(thisArg, arg1, arg2) call(thisArg, arg1, arg2, /* …, */ argN)
Параметры
-
thisArg - Значение, которое будет использоваться как
thisпри вызовеfunc. Если функция не находится в строгом режиме,nullиundefinedбудут заменены глобальным объектом, а примитивные значения будут преобразованы в объекты. -
arg1, …,argNНеобязательно - Аргументы для функции.
Возвращаемое значение
Результат вызова функции с указанным значением this и аргументами.
Описание
Примечание: Эта функция почти идентична apply(), за исключением того, что аргументы функции передаются в call() индивидуально в виде списка, в то время как для apply() они объединяются в один объект, обычно массив — например, func.call(this, "eat", "bananas") против func.apply(this, ["eat", "bananas"]).
Обычно, при вызове функции, значение this внутри функции — это объект, через который был получен доступ к функции. С помощью call() вы можете назначить произвольное значение как this при вызове существующей функции, не прикрепляя предварительно функцию к объекту в качестве свойства. Это позволяет использовать методы одного объекта как универсальные служебные функции.
Предупреждение: Не используйте call() для цепочки конструкторов (например, для реализации наследования). Это вызывает функцию конструктора как обычную функцию, что означает, что new.target имеет значение undefined, а классы выдают ошибку, поскольку их нельзя вызывать без new. Вместо этого используйте Reflect.construct() или extends.
Примеры
Использование call() для вызова функции и указания значения this
В приведенном ниже примере, когда мы вызываем greet, значение this будет связано с объектом obj, даже если greet не является методом obj.
function greet() {
console.log(this.animal, "typically sleep between", this.sleepDuration);
}
const obj = {
animal: "cats",
sleepDuration: "12 and 16 hours",
};
greet.call(obj); // cats typically sleep between 12 and 16 hours
Использование call() для вызова функции без указания первого аргумента
Если первый параметр thisArg опущен, по умолчанию используется undefined. В нестрогом режиме значение this затем заменяется на globalThis (что похоже на глобальный объект).
globalThis.globProp = "foo";
function display() {
console.log(`globProp value is ${this.globProp}`);
}
display.call(); // Logs "globProp value is foo"
В строгом режиме значение this не заменяется, поэтому оно остается undefined.
"use strict";
globalThis.globProp = "foo";
function display() {
console.log(`globProp value is ${this.globProp}`);
}
display.call(); // throws TypeError: Cannot read the property of 'globProp' of undefined
Преобразование методов в служебные функции
call() почти эквивалентно обычному вызову функции, за исключением того, что this передается как обычный параметр, а не как значение, через которое был получен доступ к функции. Это похоже на то, как работают универсальные служебные функции: вместо вызова array.map(callback) вы используете map(array, callback), который позволяет вам использовать map с объектами, подобными массиву, которые не являются массивами (например, arguments) без изменения Object.prototype.
Возьмем, к примеру, Array.prototype.slice(), которую вы хотите использовать для преобразования объекта, похожего на массив, в реальный массив. Вы можете создать сокращение, подобное этому:
const slice = Array.prototype.slice; // … slice.call(arguments);
Обратите внимание, что вы не можете сохранить slice.call и вызывать его как обычную функцию, потому что метод call() также считывает свое значение this, которое является функцией, которую он должен вызвать. В этом случае вы можете использовать bind() для привязки значения this для call(). В следующем фрагменте кода slice() является привязанной версией Function.prototype.call(), с привязанным значением this к Array.prototype.slice(). Это означает, что дополнительные вызовы call() могут быть исключены:
// Same as "slice" in the previous example const unboundSlice = Array.prototype.slice; const slice = Function.prototype.call.bind(unboundSlice); // … slice(arguments);
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
call |
1 |
12 |
1 |
4 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0При вызове этого методаthisArg не по умолчанию является глобальным объектом. |
См. также
Function.prototype.bind()Function.prototype.apply()Reflect.apply()- Синтаксис расширения (
...) - Введение в объектно-ориентированный JavaScript
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call