Get to know MDN better
Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
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 bind() des instances de Function crée une nouvelle fonction qui, lorsqu'elle est appelée, appelle cette fonction avec son mot-clé this défini sur la valeur fournie, et une séquence d'arguments donnée précédant ceux fournis lors de l'appel de la nouvelle fonction.
La valeur à transmettre en tant que paramètre this à la fonction cible func lorsque la fonction liée est appelée. Si la fonction n'est pas en mode strict, null et undefined seront remplacées par l'objet global, et les valeurs primitives seront converties en objets. La valeur est ignorée si la fonction liée est construite en utilisant l'opérateur new.
arg1, …, argN FacultatifArguments à faire précéder aux arguments fournis à la fonction liée lors de l'invocation de func.
Une copie de la fonction avec la valeur this définie et les arguments initiaux (si fournis).
La fonction bind() crée une nouvelle fonction liée. Appeler la fonction liée entraîne généralement l'exécution de la fonction qu'elle enveloppe, appelée aussi fonction cible. La fonction liée stocke les paramètres passés — qui incluent la valeur de this et les premiers arguments — comme état interne. Ces valeurs sont stockées à l'avance, au lieu d'être passées lors de l'appel. On peut généralement voir const boundFn = fn.bind(thisArg, arg1, arg2) comme équivalent à const boundFn = (...restArgs) => fn.call(thisArg, arg1, arg2, ...restArgs) pour l'effet lors de l'appel (mais pas lors de la construction de boundFn).
Une fonction liée peut être liée à nouveau en appelant boundFn.bind(thisArg, /* autres arguments */), ce qui crée une autre fonction liée boundFn2. La nouvelle valeur liée de thisArg est ignorée, car la fonction cible de boundFn2, qui est boundFn, possède déjà un this lié. Quand boundFn2 est appelée, elle appelle boundFn, qui à son tour appelle fn. Les arguments que fn reçoit finalement sont, dans l'ordre : les arguments liés par boundFn, ceux liés par boundFn2, puis les arguments reçus par boundFn2.
Une fonction liée peut également être construite à l'aide de l'opérateur new si sa fonction cible est constructible. Cela agit comme si la fonction cible avait été construite à la place. Les arguments préfixés sont transmis à la fonction cible comme d'habitude, tandis que la valeur this fournie est ignorée (car la construction prépare son propre this, comme le montrent les paramètres de Reflect.construct). Si la fonction liée est directement construite, new.target sera la fonction cible. (Autrement dit, la fonction liée est transparente pour new.target.)
Cependant, une fonction liée ne possède pas la propriété prototype, elle ne peut donc pas être utilisée comme classe de base pour extends.
Lorsqu'une fonction liée est utilisée comme opérande à droite de instanceof, instanceof va chercher la fonction cible (qui est stockée en interne dans la fonction liée) et lire sa propriété prototype.
La fonction liée possède les propriétés suivantes :
lengthLa longueur (length) de la fonction cible moins le nombre d'arguments liés (sans compter le paramètre thisArg), 0 étant la valeur minimale.
nameLe nom (name) de la fonction cible précédé du préfixe "bound".
La fonction liée hérite également de la chaîne de prototypes de la fonction cible. Cependant, elle ne possède pas d'autres propriétés propres de la fonction cible (comme les propriétés statiques si la fonction cible est une classe).
La façon la plus simple d'utiliser bind() est de faire une fonction qui, peu importe la façon dont elle est appellée, le sera avec une certaine valeur this donnée.
Une erreur courante lorsqu'on débute en JavaScript est d'extraire une méthode d'un objet, puis plus tard d'appeler cette méthode depuis un objet et de s'attendre à utiliser l'objet original en tant que valeur de this (par exemple en utilisant cette méthode dans un callback).
Sans précaution particulière, cependant, l'objet original est généralement perdu. Créer une fonction liée à partir de la fonction, en utilisant l'objet original, résout proprement ce problème :
Note : Si vous exécutez cet exemple en mode strict, le paramètre this de retrieveX sera lié à undefined au lieu de globalThis, ce qui fera échouer l'appel à retrieveX().
Si vous exécutez cet exemple dans un module ECMAScript, le this de niveau supérieur sera lié à undefined au lieu de globalThis, ce qui fera échouer l'affectation this.x = 9.
Si vous exécutez cet exemple dans un module Node CommonJS, le this de niveau supérieur sera lié à module.exports au lieu de globalThis. Cependant, le paramètre this de retrieveX sera toujours lié à globalThis en mode non strict et à undefined en mode strict. Ainsi, en mode non strict (le mode par défaut), l'appel à retrieveX() retournera undefined car this.x = 9 écrit dans un objet différent (module.exports) de celui que getX lit (globalThis).
En fait, certaines « médodes » intégrées sont aussi des accesseurs qui retournent des fonctions liées — un exemple notable est Intl.NumberFormat.prototype.format(), qui, lorsqu'on y accède, retourne une fonction liée que vous pouvez directement transmettre comme fonction de rappel.
Une autre utilisation de bind() consiste à créer une fonction avec des arguments initiaux prédéfinis.
Ces arguments (le cas échéant) suivent la valeur this fournie et sont ensuite insérés au début des arguments transmis à la fonction cible, suivis par les arguments transmis à la fonction liée au moment où elle est appelée.
Par défaut, à l'intérieur de setTimeout(), le mot-clé this sera défini sur globalThis, qui correspond à window dans les navigateurs. Lorsque vous travaillez avec des méthodes de classe qui nécessitent que this fasse référence à des instances de classe, vous pouvez lier explicitement this à la fonction de rappel afin de conserver l'instance.
Vous pouvez également utiliser des fonctions fléchées à cet effet.
Les fonctions liées sont automatiquement disponibles à l'usage pour toutes les instances initialisées avec l'opérateur new sur la fonction cible. Quand une fonction liée est utilisée pour construire une valeur, le this fourni est ignoré. Cependant, les arguments fournis sont toujours préremplis lors de l'appel au constructeur :
Notez qu'il n'est pas nécessaire de faire quoi que ce soit de particulier pour créer une fonction liée à utiliser avec new. new.target, instanceof, this etc. fonctionnent tous comme prévu, comme si le constructeur n'avait jamais été lié. La seule différence est qu'elle ne peut plus être utilisée pour extends.
Le corollaire est qu'il n'est pas nécessaire de faire quoi que ce soit de particulier pour créer une fonction liée à appeler simplement, même si vous préféreriez que la fonction liée ne soit appelée qu'avec new. Si vous l'appelez sans new, le this lié n'est soudainement plus ignoré.
Si vous souhaitez restreindre une fonction liée à être appelée uniquement avec new, ou uniquement sans new, la fonction cible doit appliquer cette restriction, par exemple en vérifiant que new.target !== undefined ou en utilisant une classe à la place.
L'utilisation de bind() sur des classes préserve la plupart des sémantiques de la classe, à l'exception de toutes les propriétés statiques propres à la classe courante qui sont perdues. Cependant, comme la chaîne de prototypes est préservée, vous pouvez toujours accéder aux propriétés statiques héritées de la classe parente.
bind() est également utile dans les cas où vous souhaitez transformer une méthode qui nécessite une valeur this spécifique en une fonction utilitaire simple qui accepte l'ancien paramètre this comme paramètre normal. 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 :
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 :
| ECMAScript® 2027 Language Specification # sec-function.prototype.bind |
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Cette page a été modifiée le 24 févr. 2026 par les contributeur·ice·s du MDN.
Votre modèle pour un internet meilleur.
Visitez la société mère à but non lucratif de Mozilla Corporation, la Fondation Mozilla.
Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—2026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.