JavaScriptテンプレートのソースコードを見ると、関数を生成するための興味深い使用法があることがわかりました。このメタプログラムはありませんか?
JavaScriptメタプログラム
コードコピーは次のとおりです。
メタプログラムとは、他のプログラム(またはそれ自体)をデータとして作成または操作する特定のタイプのコンピュータープログラムの執筆、または実行時にコンパイル時に完了する必要がある作業の一部を完了することを指します。
JavaScript Eval
コードコピーは次のとおりです。
eval()関数は文字列を計算し、その中のJavaScriptコードを実行します。
次の使用があるかもしれません:
コードコピーは次のとおりです。
eval( "x = 10; y = 20; document.write(x*y)")
もちろん、これは特定の機能を実行するために使用されますが、この製品はより安価で間違いを犯しやすいです。
コードコピーは次のとおりです。
評価機能はできるだけ回避する必要があります。
したがって、より良い方法は、新しいfunction()を使用することです
new function()とeval()を使用することの大きな違いは、evalが単なる関数ではないことです。
コードコピーは次のとおりです。
eval()は、現在の実行スコープ内でJavaScript式として文字列を計算し、ローカル変数へのアクセスを可能にします。 new function()は、関数オブジェクトに変換された文字列に保存されたJavaScriptコードを解析し、呼び出すことができます。コードは別のスコープで実行されるため、ローカル変数にアクセスできません。
言い換えれば、eval()は現在の関数の範囲に干渉します。 。
JavaScript new function()
関数コンストラクターは、新しい関数オブジェクトを作成します。 JavaScriptでは、各関数は実際には関数オブジェクトです。関数コンストラクターを使用して生成された関数オブジェクトは、関数が作成されるときに解析されます。これは、関数宣言を使用してコードで呼び出すよりも効率的ではありません。これは、関数ステートメントを使用して宣言された関数は他のステートメントに解析されるためです。
新しい関数()は比較して非効率的であり、これは現在の状況下で予測できるものです。
簡単な例は次のとおりです。
コードコピーは次のとおりです。
var add = new function(['x'、 'y']、 'return x + y');
新しい関数()は、文字列を関数に解析します。 。その後、適用して実行できます
コードコピーは次のとおりです。
function.Apply(null、args)
そして、これは私がJavaScriptテンプレートで見たものです:
コードコピーは次のとおりです。
新しい関数(
tmpl.arg + '、tmpl'、
"var _e = tmpl.encode" + tmpl.helper + "、_s = '" +
str.replace(tmpl.regexp、tmpl.func) +
"'; return _s;"
);
もちろん、他の方法があります。