ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript における DSL メタプログラミングの概要_javascript スキル

JavaScript における DSL メタプログラミングの概要_javascript スキル

WBOY
WBOYオリジナル
2016-05-16 16:09:262176ブラウズ

JavaScript テンプレートのソース コードを見ていたら、関数を生成するための非常に興味深い使用方法を見つけました。これはメタプログラミングではないでしょうか?

JavaScript メタプログラミング

コードをコピーします コードは次のとおりです:

メタプログラミングとは、他のプログラム (またはそれ自体) をデータとして書き込みまたは操作したり、コンパイル時に完了する必要がある作業を実行時に完了したりする、特定の種類のコンピューター プログラムの作成を指します。

JavaScript の評価

コードをコピーします コードは次のとおりです:

eval() 関数は文字列を評価し、その中の JavaScript コードを実行します。

次のように使用できます:
コードをコピー コードは次のとおりです:

eval("x=10;y=20;document.write(x*y)")

もちろん、これは特定の機能を実行するためにのみ使用されますが、この製品はコスト効率が非常に高く、エラーが発生しやすいです。
コードをコピー コードは次のとおりです:

eval 関数は可能な限り避けてください。

したがって、より良い方法は New Function() を使用することです。

New Function() と eval() の使用の大きな違いは、eval が単なる関数ではないことです。

コードをコピー コードは次のとおりです:

eval() は、現在の実行スコープ内で文字列を JavaScript 式として評価し、ローカル変数にアクセスできます。 New Function() は、そこに格納されている文字列を解析して関数オブジェクトに変換し、JavaScript コードから呼び出すことができます。コードは別のスコープで実行されるため、ローカル変数にはアクセスできません。

言い換えれば、eval() は現在の関数のスコープに干渉します。 。

JavaScript new Function()

Function コンストラクターは新しい Function オブジェクトを作成します。JavaScript では、実際には Function コンストラクターを使用して生成された Function オブジェクトが関数の作成時に解析されます。 function ステートメントを使用して宣言された関数は他のステートメントと一緒に解析されるため、これは関数を宣言してコード内で呼び出す場合よりも効率が低くなります。

New Function() はそれに比べて効率が低くなりますが、これは現在の状況で予測できることです。

簡単な例は次のようになります:

コードをコピー コードは次のとおりです:

var add = new Function(['x', 'y'], 'return x y');

new Function() は文字列を関数に解析します。 。その後、apply
を通じて実行できます。
コードをコピー コードは次のとおりです:

Function.apply(null, args)

そして、これが JavaScript テンプレートに表示されるものです:
コードをコピー コードは次のとおりです:

新しい関数(
tmpl.arg ',tmpl',
"var _e=tmpl.encode" tmpl.helper ",_s='"
str.replace(tmpl.regexp, tmpl.func)
"';return _s;"
);

もちろん他の方法もあります。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。