Heim  >  Artikel  >  Web-Frontend  >  Einführung in die DSL-Metaprogrammierung in JavaScript_Javascript-Kenntnisse

Einführung in die DSL-Metaprogrammierung in JavaScript_Javascript-Kenntnisse

WBOY
WBOYOriginal
2016-05-16 16:09:262148Durchsuche

Als ich mir den Quellcode der JavaScript-Vorlage ansah, dachte ich, ist das nicht Metaprogrammierung?

JavaScript-Metaprogrammierung

Code kopieren Der Code lautet wie folgt:

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

Code kopieren Der Code lautet wie folgt:

Die Funktion eval() wertet einen String aus und führt den darin enthaltenen JavaScript-Code aus.

Es kann wie folgt verwendet werden:
Code kopieren Der Code lautet wie folgt:

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.
Code kopieren Der Code lautet wie folgt:

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,

Code kopieren Der Code lautet wie folgt:

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:

Code kopieren Der Code lautet wie folgt:

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
Code kopieren Der Code lautet wie folgt:

Function.apply(null, args)

Und das sehe ich in der JavaScript-Vorlage:
Code kopieren Der Code lautet wie folgt:

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.
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn