Vous allez apprendre à connaître la maîtriser en JavaScript la fonction call() et à l’utiliser plus efficacement.
Introduction à la méthode JavaScript call()
En JavaScript, une fonction est une instance du type Function. Par exemple :
function add(x, y) {
return x + y;
}
console.log(add instanceof Function); // true
Le type Function.prototype possède la méthode call() avec la syntaxe suivante :
functionName.call(thisArg, arg1, arg2, ...);
Dans cette syntaxe, la méthode call() appelle une fonction functionName avec les arguments (arg1, arg2, …) et l’objet this défini sur l’objet thisArg à l’intérieur de la fonction.
- L’objet thisArg est l’objet auquel l’objet this fait référence dans la fonction functionName.
- Les arguments arg1, arg2, … sont les arguments de fonction passés dans la fonction functionName.
- La méthode call() renvoie le résultat de l’appel de la fonction functionName().
L’exemple suivant définit la fonction add() et l’appelle normalement :
function add(x, y) {
return x + y;
}
let result = add(1, 0);
console.log(result); // 3
L’exemple suivant appelle la fonction add() mais utilise la méthode call() à la place :
function add(x, y) {
return x + y;
}
let result = add.call(this, 1, 2);
console.log(result); // 3
Par défaut, l’objet this à l’intérieur de la fonction est défini comme l’objet global, c’est-à-dire window dans les navigateurs web et global dans Node.js.
Voyons plus en détail cet exemple :
var message = 'Hi';
var messenger = {
message : 'Hello'
}
function say(nom) {
console.log(this.message + ' ' + nom);
}
À l’intérieur de la fonction say(), nous faisons référence à la salutation via la valeur this. Si vous invoquez simplement la fonction say() via la méthode call() comme suit :
say.call(this,'John');
Il affichera la sortie suivante dans la console :
"Hi John"
Cependant, lorsque vous invoquez la méthode call() de l’objet fonction say et que vous passez l’objet messager comme valeur :
say.call(messenger,'John');
résultat
"Hello John"
Dans ce cas, la valeur this dans la fonction say() fait référence à l’objet messager, et non à l’objet global.