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;"
);
もちろん他の方法もあります。