Function : méthode call()
Baseline
Widely available
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.
La méthode call() des instances de Function appelle cette fonction avec une valeur this donnée et des arguments fournis individuellement.
Exemple interactif
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = "nourriture";
}
console.log(new Food("fromage", 5).name);
// Résultat attendu : "fromage"
Syntaxe
call(thisArg)
call(thisArg, arg1)
call(thisArg, arg1, arg2)
call(thisArg, arg1, arg2, /* …, */ argN)
Paramètres
thisArg-
La valeur à utiliser comme
thislors de l'appel defunc. Si la fonction n'est pas en mode strict,nulletundefinedseront remplacées par l'objet global, et les valeurs primitives seront converties en objets. arg1, …,argNFacultatif-
Les arguments pour la fonction.
Valeur de retour
Le résultat de l'appel de la fonction invoquée avec la valeur this indiquée et les arguments fournis.
Description
Note :
Cette fonction est presque identique à apply(), sauf que les arguments de la fonction sont passés à call() individuellement sous forme de liste, tandis que pour apply() ils sont regroupés dans un seul objet, généralement un tableau — par exemple, func.call(this, "eat", "bananas") contre func.apply(this, ["eat", "bananas"]).
Normalement, lors de l'appel d'une fonction, la valeur de this à l'intérieur de la fonction est l'objet sur lequel la fonction a été appelée. Avec call(), vous pouvez attribuer une valeur arbitraire à this lors de l'appel d'une fonction existante, sans d'abord rattacher la fonction à l'objet comme propriété. Cela vous permet d'utiliser les méthodes d'un objet comme fonctions utilitaires génériques.
Attention :
N'utilisez pas call() pour chaîner des constructeurs (par exemple, pour implémenter l'héritage). Cela invoque la fonction constructeur comme une fonction ordinaire, ce qui signifie que new.target vaut undefined, et les classes lèvent une erreur car elles ne peuvent pas être appelées sans new. Utilisez plutôt Reflect.construct() ou extends.
Exemples
Utiliser call() pour invoquer une fonction et définir la valeur de this
Dans l'exemple ci-dessous, lorsque nous appelons meilleur, la valeur de this sera liée à l'objet obj, même si meilleur n'est pas une méthode de obj.
function meilleur() {
console.log(this.animal, "dorment généralement entre", this.sleepDuration);
}
const obj = {
animal: "chats",
sleepDuration: "12 et 16 heures",
};
meilleur.call(obj); // chats dorment généralement entre 12 et 16 heures
Utiliser call() pour invoquer une fonction sans indiquer le premier argument
Si le premier paramètre thisArg est omis, il prend la valeur undefined par défaut. En mode non strict, la valeur de this est alors remplacée par globalThis (qui correspond à l'objet global).
globalThis.globProp = "toto";
function afficher() {
console.log(`La valeur de globProp est ${this.globProp}`);
}
afficher.call(); // Logs "La valeur de globProp est toto"
En mode strict, la valeur de this n'est pas remplacée, elle reste donc undefined.
"use strict";
globalThis.globProp = "toto";
function afficher() {
console.log(`La valeur de globProp est ${this.globProp}`);
}
afficher.call(); // throws TypeError: Cannot read the property of 'globProp' of undefined
Transformer des méthodes en fonctions utilitaires
call() est presque équivalent à un appel de fonction normal, sauf que this est passé comme un paramètre normal au lieu d'être la valeur sur laquelle la fonction a été appelée. Cela ressemble à la façon dont fonctionnent les fonctions utilitaires généralistes : au lieu d'appeler array.map(callback), vous utilisez map(array, callback), ce qui vous permet d'utiliser map avec des objets ressemblant à des tableaux qui ne sont pas des tableaux (par exemple, arguments) sans modifier Object.prototype.
Prenons Array.prototype.slice(), par exemple, que vous souhaitez utiliser pour convertir un objet ressemblant à un tableau en un vrai tableau. Vous pourriez créer un raccourci comme ceci :
const slice = Array.prototype.slice;
// …
slice.call(arguments);
Notez que vous ne pouvez pas sauvegarder slice.call et l'appeler comme une fonction simple, car la méthode call() lit également sa valeur this, qui est la fonction qu'elle doit appeler. Dans ce cas, vous pouvez utiliser bind() pour lier la valeur de this pour call(). Dans le code suivant, slice() est une version liée de Function.prototype.call(), avec la valeur this liée à Array.prototype.slice(). Cela signifie que les appels supplémentaires à call() peuvent être éliminés :
// Identique à "slice" dans l'exemple précédent
const unboundSlice = Array.prototype.slice;
const slice = Function.prototype.call.bind(unboundSlice);
// …
slice(arguments);
Spécifications
| Specification |
|---|
| ECMAScript® 2026 Language Specification # sec-function.prototype.call |
Compatibilité des navigateurs
Voir aussi
- La méthode
Function.prototype.bind() - La méthode
Function.prototype.apply() - La méthode
Reflect.apply() - Syntaxe de décomposition (
...) - Introduction à JavaScript orienté objet