La première fois que j'ai traduit un article technique, je me suis moqué de vous!
Texte d'origine traduit:
Function.apply et function.Call en javascript
Le premier paragraphe est omis.
Chaque fonction JavaScript possède de nombreuses méthodes jointes, notamment ToString (), Call () et Apply (). Il semble que vous trouverez étrange qu'une fonction puisse avoir ses propres méthodes, mais n'oubliez pas que chaque fonction en JavaScript est un objet. Jetez un œil à cet article et passez en revue les fonctionnalités JavaScript (rafraîchis). Vous pouvez également connaître la différence entre les fonctions et les méthodes en JavaScript. Je pense que la description des "fonctions" et des "méthodes" n'est qu'une convention habituelle de JavaScript. Les fonctions sont basées sur elles-mêmes (par exemple: alert ()), et les méthodes sont les attributs d'un objet à l'intérieur de la fonction (dictionnaire), et nous appelons des méthodes via des objets. Chaque objet JavaScript a une méthode toString (). Ce qui suit est un exemple du code. Dans un objet de fonction, nous pouvons utiliser la méthode toString ().
fonction foo () {alert ('x');} alert (foo.toString ());Parce que les fonctions sont des objets, ils ont leurs propres propriétés et méthodes. Nous pouvons les considérer comme des données. Dans cet article, nous nous concentrons uniquement sur les méthodes de deux fonctions Appliquez () et Call ().
Commençons par le code suivant:
var x = 10; fonction f () {alert (this.x);} f ();Nous définissons une fonction globale f (). F () accède à la variable X via ce mot-clé, mais il convient de noter que nous ne pouvons pas appeler cette fonction via une instance d'un objet. À quel objet cela indique-t-il? Cela indiquera cet objet global. Notre variable X est définie dans cet objet global. Le code ci-dessus peut s'exécuter normalement. Le résultat en cours affichera une boîte de dialogue et 10 s'affiche dans la boîte de dialogue.
Nous pouvons appeler Call () et appliquer () via ceci. Comme l'exemple suivant montre comment utiliser Call ():
var x = 10; var o = {x: 15}; fonction f () {alert (this.x);} f (); f.call (o);Tout d'abord, l'appel f () affichera la boîte de dialogue de 10, car ce point vers l'objet global pour le moment. Ensuite, nous appelons la méthode Call () de la fonction F, le paramètre passé dans est O, et le résultat d'exécution montre la valeur de l'attribut x dans O 15. La méthode Call () utilisera son premier paramètre comme pointeur vers la fonction F. Autrement dit, nous indiquerons au runtime quel objet ceci dans la fonction F pointe vers.
Ce saut semble un peu drôle, et c'est même une anomalie pour les programmeurs C ++, Java et C #. Ce sont toutes des parties intéressantes d'Ecmascript.
Vous pouvez également transmettre des paramètres à la fonction via Call ():
var x = 10; var o = {x: 15}; fonction f () {alert (this.x);} f (); f.call (o);appliquer () et call () sont similaires, sauf qu'appliquer () nécessite que le deuxième paramètre doit être un tableau. Ce tableau sera passé comme argument à la fonction cible.
var x = 10; var o = {x: 15}; fonction f (message) {alert (message); alert (this.x);} f ('invoquer f'); f.apply (o, ['invoquer f par application']);La méthode applique () est utile car nous pouvons créer une fonction sans se soucier des paramètres de la méthode cible. Cette fonction peut transmettre des paramètres supplémentaires à la méthode via le deuxième paramètre de tableau d'application ().
var o = {x: 15}; fonction f1 (message1) {alert (message1 + this.x);} fonction f2 (message1, message2) {alert (message1 + (this.x * this.x) + message2);} function g (objet, func, args) {func.Apply (objet, args);} g (o, f1, ['la valeur de x =') f2, [la valeur de x squared = ','.Il y a quelque chose qui ne va pas avec cette syntaxe. Afin d'appeler la méthode Appliquer (), nous obligeons la fonction objectif à utiliser les paramètres dans le tableau. Heureusement, il existe un moyen de faciliter cette syntaxe. Avant cela, nous devons d'abord en introduire un: identifiant de paramètres.
Dans JavaScript, chaque fonction a en fait une liste de paramètres de longueur variable. Cela signifie que même si une fonction n'a qu'un seul paramètre, nous pouvons y transmettre 5 paramètres. Le code suivant n'aura pas d'erreurs et le résultat affiche "h".
fonction f (message) {alert (message);} f ('h', 'e', 'l', 'l', 'o');Dans f (), si nous ne voulons pas accepter d'autres paramètres, nous pouvons utiliser les arguments de mots clés. Les arguments représentent un objet d'argument, qui a un attribut représentant une longueur similaire à un tableau.
fonction f (message) {// La valeur du message est la même que les arguments [0] pour (var i = 1; i <arguments.length; i ++) {message + = arguments [i]; } alert (message);} // Le résultat montre "Hello" f ('h', 'e', 'l', 'l', 'o');Vous devez savoir que, à proprement parler, les arguments ne sont pas un tableau. Les arguments ont un attribut de longueur, mais il n'y a pas de méthodes divisées, push et pop. Dans la fonction G () précédente, nous pouvons copier les paramètres requis à partir des arguments, former un tableau, puis passer ce tableau pour appliquer ().
var o = {x: 15}; fonction f (message1, message2) {alert (message1 + (this.x * this.x) + message2);} fonction g (objet, func) {// arguments [0] = objet // arguments [1] = func var args = []; for (var i = 2; i <arguments.length; i ++) {args.push (arguments [i]); } func.Apply (objet, args);} g (o, f, 'la valeur de x squared =', '. wow!');Lorsque nous appelons g (), nous pouvons transmettre des arguments supplémentaires comme paramètres au lieu de fourrer les arguments dans un tableau.