好的,我想我在Rhino中发现了一个错误。我试图在全局范围内动态评估代码,如果我只是做eval.call(null,“代码到eval”),它工作正常;一切顺利,直到我试图捕获异常。当我用try / catch包围该代码时,代码实际上并未在全局上下文中进行评估。
说明错误:
function works(str) {
eval.call(null, str);
}
function doesntWork(str, count) {
try {
eval.call(null, str);
} catch (e) {
println('Error in ' + count + ' call: ' + e);
}
}
works('var abc = 123;');
works('println("The value: " + abc);');
doesntWork('var xyz = 123;', 'first');
doesntWork('println("The value: " + xyz);', 'second');
当我在OpenJDK 6中内置的Rhino中运行时,我得到:
The value: 123
Error in second call: ReferenceError: "xyz" is not defined.
当我将println更改为console.log并在Chrome中运行时,我更确信这是一个错误,此时我得到了2个“值:123”日志,这正如我所料。
此外,我抬起ECMAScript standard并得到了这个:
10.4.2输入评估代码
执行以下步骤时 控制进入执行上下文 对于评估代码:
- 如果没有调用上下文或者没有eval代码 通过直接电话评估 (15.1.2.1.1)到eval函数 然后,
- 初始化执行上下文,就好像它是全局执行一样 使用eval代码作为C的上下文 描述于10.4.1.1。
- 否则,
- 将ThisBinding设置为与ThisBinding相同的值 调用执行上下文。
- 将LexicalEnvironment设置为与LexicalEnvironment相同的值 调用执行上下文。
- 将VariableEnvironment设置为与。相同的值 调用的VariableEnvironment 执行上下文。
- 如果eval代码是严格的代码,那么
- 让strictVarEnv成为调用NewDeclarativeEnvironment的结果 通过LexicalEnvironment作为 参数。
- 将LexicalEnvironment设置为strictVarEnv。
- 将VariableEnvironment设置为strictVarEnv。
- 按照10.5中的描述执行声明绑定实例化 使用eval代码。
醇>
第一点是我的情况,或者“没有调用上下文”,所以这应该在全局上下文中进行评估,并且我的xyz变量应该可以正常工作。
我是否真的遇到了犀牛虫,或者我错过了什么?
答案 0 :(得分:2)
JDK中内置的Rhino代码确实非常古老,并且在Mozilla当前版本的软件中已经修复了很多错误(很长一段时间)。
如果您正在开始一个新项目,我强烈建议您查看仅使用from-Mozilla代码集成Rhino的情况,并且只要相信1.6中的所有“ScriptEngine”内容都不是那里(或者,可能,围绕Mozilla的东西实现你自己的ScriptEngine代码)。不要犯同样的错误。两次。 : - (