NashornがJVMのバイトコードをオンザフライでコンパイルすることを理解します。しかし、Stringを使ってeval関数を見つけたとき、Nashornは何をしますか?それは文字列の内容をコンパイルするか、それを解釈しますか?例えばNashorn Javascriptは "eval"ステートメントをコンパイルしますか?
:
function sayHi() {
console.log("hi world");
}
for (var i=0;i<10;i++) {
eval("sayHi()"); // what happens here?
}
カップルのオプションは次のようになります。 1)それはevalの 2内の文字列をコンパイルしません)それは、それをキャッシュし、一度それをコンパイルし、同じバイトコードを再利用(上記のループの場合と同じ) 3)毎回eval Stringの内容を新しいものに再コンパイルする
もちろん、これはeval文字列の内容メソッド呼び出しですが、より複雑なJSコードが文字列intとして渡されると想像してくださいo eval。
ハードコードされた文字列で 'eval()'を使用することはほとんどありません。通常は 'eval()'が推奨されていませんが、あなたが*使用しようとしているのであれば、コンパイル時には知られていない値を持つ。 – nnnnnn
これでevalの文字列が動的であるとしましょう。その後、まずJITを一時クラスにコンパイルしてからすぐにクラスをアンロードします。または、Rhinoのインタプリタモードと同様に解釈されますか?または別のオプション? – adamM