Als ich mir den Quellcode der JavaScript-Vorlage ansah, dachte ich, ist das nicht Metaprogrammierung?
JavaScript-Metaprogrammierung
Unter Metaprogrammierung versteht man das Schreiben bestimmter Arten von Computerprogrammen, die andere Programme (oder sich selbst) als deren Daten schreiben oder manipulieren oder zur Laufzeit eine Arbeit erledigen, die zur Kompilierungszeit abgeschlossen sein sollte.
JavaScript-Bewertung
Die Funktion eval() wertet einen String aus und führt den darin enthaltenen JavaScript-Code aus.
Es kann wie folgt verwendet werden:
eval("x=10;y=20;document.write(x*y)")
Dies dient natürlich nur der Ausführung einer bestimmten Funktion, jedoch ist dieses Produkt sehr kostengünstig und fehleranfällig.
Die Eval-Funktion sollte nach Möglichkeit vermieden werden.
Ein besserer Weg ist also die Verwendung von New Function()
Der große Unterschied zwischen der Verwendung von New Function() und eval() besteht darin, dass eval nicht nur eine Funktion ist,
eval() wertet einen String als JavaScript-Ausdruck innerhalb des aktuellen Ausführungsbereichs aus und kann auf lokale Variablen zugreifen. New Function() analysiert einen darin gespeicherten String in ein Funktionsobjekt, das dann von JavaScript-Code aufgerufen werden kann. Da der Code in einem separaten Bereich ausgeführt wird, kann nicht auf lokale Variablen zugegriffen werden.
Mit anderen Worten: eval() beeinträchtigt den Umfang der aktuellen Funktion. .
JavaScript neue Funktion()
Der Funktionskonstruktor erstellt ein neues Funktionsobjekt. In JavaScript ist jede Funktion (Funktion) tatsächlich ein Funktionsobjekt. Das mit dem Funktionskonstruktor generierte Funktionsobjekt wird beim Erstellen der Funktion analysiert. Dies ist weniger effizient, als wenn Sie eine Funktion deklarieren und in Ihrem Code aufrufen, da mit Funktionsanweisungen deklarierte Funktionen zusammen mit anderen Anweisungen analysiert werden.
New Function() wird im Vergleich weniger effizient sein, und das können wir in der aktuellen Situation vorhersagen.
Ein einfaches Beispiel sieht so aus:
var add = new Function(['x', 'y'], 'return x y');
new Function() analysiert die Zeichenfolge in eine Funktion. . Dann können wir es über apply
ausführen
Function.apply(null, args)
Und das sehe ich in der JavaScript-Vorlage:
neue Funktion(
tmpl.arg ',tmpl',
"var _e=tmpl.encode" tmpl.helper ",_s='"
str.replace(tmpl.regexp, tmpl.func)
"';return _s;"
);
Natürlich haben wir auch andere Methoden.