【发布时间】:2016-11-21 17:15:19
【问题描述】:
我了解 Nashorn 可以即时编译为 JVM 字节码。但是,当 Nashorn 遇到带有 String 的 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 代码作为字符串传递给 eval。
【问题讨论】:
-
将
eval()与硬编码字符串一起使用没有什么意义 - 通常不建议使用eval(),但如果您打算使用它,则重点通常是将一个动态创建的字符串传递给它,该字符串的值在编译时是未知的。 -
好的,我们假设要 eval 的字符串是动态的。是不是先即时编译成一个临时类,然后马上把类卸载掉。或者,它只是类似于 Rhino 解释模式的解释?还是其他选择?
标签: javascript jvm jit nashorn