Pour commémorer que je n'ai pas écrit de blog depuis 10 ans, le premier article de blog commencera par une astuce aussi intéressante -___-
Dans ES5, lorsque nous appelons une fonction, si les paramètres à passer sont générés sur la base d'autres fonctions ou conditions, c'est-à-dire que lorsque nous ne savons pas combien de paramètres seront passés, que devons-nous faire sans modifier la fonction d'origine?
(Bien sûr, essayez d'éviter la situation décrite dans cet article, comme la modification du paramètre en objet ou en tableau, etc.)
La plupart des gens peuvent savoir que l'utilisation de l'application peut résoudre parfaitement ce problème:
Comme l'appel, appliquez le premier paramètre sera utilisé comme objet d'appel de la fonction, c'est-à-dire que le pointeur de ceci dans la fonction d'appel est réécrit comme le premier paramètre. Si ce n'est pas la méthode de l'objet, vous pouvez l'ignorer et passer un null.
La différence est que les paramètres suivants, applique, place tous les paramètres à transmettre dans la fonction d'appel dans un tableau, et l'appel est annexé en séquence comme la fonction d'origine.
Puisqu'il s'agit d'un tableau, il est contrôlable. La génération d'un tableau basé sur d'autres fonctions ou des jugements logiques peut atteindre le but de transmettre des paramètres de nombre dynamique.
Mais j'ai rencontré un mal de tête. J'ai dû passer dans des paramètres dynamiques lors de la création d'un objet avec nouveau. Cela ne m'a pris qu'une fois tous les quelques années:
Si vous utilisez ES6, avec le paramètre de repos, aucun des problèmes ci-dessus n'est problématique. Notez que l'ajout de trois points avant les args du tableau n'est pas une erreur de syntaxe, mais une méthode d'écriture de paramètres REST fournie par ES6. Vous pouvez le comprendre comme le remplacement ... Args par Args Array par des personnages après des crochets.
Mais est-il vraiment impossible de mettre en œuvre dans ES5? Après tout, la plupart des ES6 sont du sucre syntaxique, et vous pouvez utiliser des outils comme Babel pour compiler à ES5. Avec des questions, utilisons Babel pour compiler et voir ce que nous obtenons:
J'ai été choqué quand j'ai vu la dernière ligne. N'ayez pas peur. Analysons ce code. Tout d'abord, démettons-le et regardons-le en trois étapes:
1. Il ne fait aucun doute que l'utilisation de Concat pour concaténer null avec nos paramètres dans un tableau, comme le deuxième paramètre appliqué, c'est-à-dire que nous obtenons [null, 1, 2, 3];
2. Calcularons-le. Le premier paramètre FOO remplacera la fonction pour appeler la méthode de liaison native. Le contenu du deuxième tableau de paramètres sera transmis en tant que paramètre de liaison, c'est-à-dire foo.bind (null, 1, 2, 3);
3. Le premier paramètre de la méthode de liaison est similaire à l'application et à l'appel, à modifier ce pointeur, et les paramètres suivants peuvent implanter la valeur d'argument principale prédéfini par défaut pour la fonction. C'est-à-dire que lorsque la liaison est exécutée, nous obtenons une classe FOO avec trois valeurs de paramètres injectées dans le premier ensemble de supports, qui est appelé foowithargs pour le moment;
Enfin, lorsque nous ne nouveaux foowithargs (); , nous n'avons pas besoin de passer dans aucun paramètre. Équivalent au nouveau FOO (1, 2, 3);