Spec-Zone.ru › JavaScript

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);

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

Спецификация
ECMAScript® 2027 Language Specification
# sec-function.prototype.call

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

Настольные компьютеры Мобильные устройства Сервер
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API