Zum Gedenken, dass ich seit 10 Jahren keinen Blog mehr geschrieben habe, beginnt der erste Blog-Beitrag mit einem so interessanten Trick -___-
Wenn wir in ES5 eine Funktion nennen, wenn die zu übergebenen Parameter basierend auf anderen Funktionen oder Bedingungen generiert werden, dann, wenn wir nicht sicher sind, wie viele Parameter übergeben werden, was sollten wir tun, ohne die ursprüngliche Funktion zu ändern?
(Versuchen Sie natürlich, die in diesem Artikel beschriebene Situation zu vermeiden, z. B. das Ändern des Parameters in Objekt oder Array usw.)
Die meisten Menschen wissen möglicherweise, dass die Verwendung von Anwendung dieses Problem perfekt lösen kann:
Wie Anruf wird der erste Parameter anwenden, der als aufgerufenes Objekt der Funktion verwendet wird, dh der Zeiger davon in der Aufruffunktion wird als erster Parameter umgeschrieben. Wenn es nicht die Methode des Objekts ist, können Sie dies ignorieren und einen Null übergeben.
Der Unterschied besteht darin, dass die folgenden Parameter, angewendet, alle Parameter in die Aufruffunktion in einem Array übergeben werden, und der Anruf wird nach der ursprünglichen Funktion nacheinander angehängt.
Da es sich um ein Array handelt, ist es steuerbar. Wenn Sie ein Array basieren, das auf anderen Funktionen oder logischen Urteilen basiert, können Sie die Dynamiknummernparameter übergeben.
Aber ich stieß auf Kopfschmerzen. Ich musste dynamische Parameter übergeben, wenn ich ein Objekt mit neu erstellen musste. Es dauerte nur einmal alle paar Jahre:
Wenn Sie ES6 mit dem Restparameter verwenden, ist keiner der oben genannten Probleme problematisch. Beachten Sie, dass das Hinzufügen von drei Punkten vor den Array -Argumenten kein Syntaxfehler, sondern eine von ES6 bereitgestellte REST -Parameter -Schreibmethode ist. Sie können es als ersetzt verstehen ... args mit args Array mit Charakteren nach quadratischen Klammern.
Aber ist es wirklich unmöglich, in ES5 umzusetzen? Immerhin ist die meisten ES6 syntaktischer Zucker, und Sie können Werkzeuge wie Babel verwenden, um es 5 zu kompilieren. Lassen Sie uns mit Fragen Babel zusammenstellen und sehen, was wir bekommen:
Ich war schockiert, als ich die letzte Zeile sah. Hab keine Angst. Lassen Sie uns diesen Code analysieren. Lassen Sie uns zunächst zerstückeln und es in drei Schritten betrachten:
1. Es besteht kein Zweifel, dass die Verwendung von concat zur Verkettung von Null mit unseren Parametern in ein Array, wie der zweite Parameter, dh [null, 1, 2, 3] erhalten;
2. Berechnen wir anwenden. Der erste Parameter FOO ersetzt die Funktion, um die native Bindungsmethode aufzurufen. Der Inhalt des zweiten Parameterarrays wird als Bind -Parameter übergeben, dh foo.bind (null, 1, 2, 3);
3. Der erste Parameter der BIND -Methode ist ähnlich wie das Anwenden und Aufruf, ändern Sie diesen Zeiger, und die nachfolgenden Parameter können den standardmäßigen voreinsatz führenden Argumentwert für die Funktion implantieren. Das heißt, wenn die Bindung ausgeführt wird, erhalten wir eine Foo -Klasse mit drei Parameterwerten, die in den ersten Satz von Klammern injiziert sind, was vorerst Foowithargs bezeichnet wird.
Schließlich, wenn wir neue foowithargs (); Wir müssen keine Parameter übergeben. Äquivalent zu New Foo (1, 2, 3);