在try / catch中的犀牛中的Eval bug

时间:2011-06-03 22:55:13

标签: javascript eval rhino

好的,我想我在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输入评估代码

     

执行以下步骤时   控制进入执行上下文   对于评估代码:

     
      
  1. 如果没有调用上下文或者没有eval代码   通过直接电话评估   (15.1.2.1.1)到eval函数   然后,   
        
    1. 初始化执行上下文,就好像它是全局执行一样   使用eval代码作为C的上下文   描述于10.4.1.1。
    2.   
  2.   
  3. 否则,   
        
    1. 将ThisBinding设置为与ThisBinding相同的值   调用执行上下文。
    2.   
    3. 将LexicalEnvironment设置为与LexicalEnvironment相同的值   调用执行上下文。
    4.   
    5. 将VariableEnvironment设置为与。相同的值   调用的VariableEnvironment   执行上下文。
    6.   
  4.   
  5. 如果eval代码是严格的代码,那么   
        
    1. 让strictVarEnv成为调用NewDeclarativeEnvironment的结果   通过LexicalEnvironment作为   参数。
    2.   
    3. 将LexicalEnvironment设置为strictVarEnv。
    4.   
    5. 将VariableEnvironment设置为strictVarEnv。
    6.   
  6.   
  7. 按照10.5中的描述执行声明绑定实例化   使用eval代码。
  8.   

第一点是我的情况,或者“没有调用上下文”,所以这应该在全局上下文中进行评估,并且我的xyz变量应该可以正常工作。

我是否真的遇到了犀牛虫,或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

JDK中内置的Rhino代码确实非常古老,并且在Mozilla当前版本的软件中已经修复了很多错误(很长一段时间)。

如果您正在开始一个新项目,我强烈建议您查看仅使用from-Mozilla代码集成Rhino的情况,并且只要相信1.6中的所有“ScriptEngine”内容都不是那里(或者,可能,围绕Mozilla的东西实现你自己的ScriptEngine代码)。不要犯同样的错误。两次。 : - (