0

当我运行此 java 代码时,我能够获取函数外部定义的变量值,但无法获取函数内部定义的变量值。如何访问这些变量值?

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;


public class JSFunctionTest {

public static void main(String args[]) {

    String code = "var name='nc',global_a = 'jill'; " + "\n"+
            "function myfunc(b) { " + "\n"+
            "var local_a = 1;" + "\n"+
            "global_a = 'jack';" + "\n"+
            " return b;" + "\n"+
            "}"; 

    Context context = Context.enter();
    context.setGeneratingDebug(true);
    context.setOptimizationLevel(-1);

    Scriptable scope = context.initStandardObjects(); 

    context.evaluateString(scope, code, "code", 1, null);
    //getting values of varables
    System.out.println("var name:"+scope.get("name", scope));
    System.out.println("var global_a:"+scope.get("global_a", scope));
    System.out.println("var local_a:"+scope.get("local_a", scope));//not found becase function wasnt run

    //calling the function.
    Object fObj = scope.get("myfunc", scope);
    if (!(fObj instanceof Function)) {
        System.out.println("myfunc is undefined or not a function.");
    } else {
        Object functionArgs[] = { "nc" };
        Function f = (Function)fObj;
        Object r = f.call(context, scope, scope, functionArgs);
        String report = "myfunc('nc') = " + Context.toString(r);

        //trying to access global and local a after calling function
        System.out.println("var global_a:"+scope.get("global_a", scope));//values is changed, because this is defined out side the function.
        System.out.println("var local_a:"+scope.get("local_a", scope));// still not found,after running the function.

        System.out.println(report);
    }

}

}

4

2 回答 2

1

通过在 Rhino 中使用调试 API 实现调试器,我能够解决这个问题。

  1. 实现您自己的调试器和调试框架类。
  2. 使用 setDebugger() 方法将它们连接到您的上下文
  3. 在 DebugFrame 类中,我已经实现了。在 onEnter 方法中缓存范围对象。
  4. 在 onLineChange 方法中,您可以使用 ScriptableObject.getProperty() 传递缓存范围对象并给出名称来获取局部变量
于 2012-07-25T15:29:44.253 回答
0

在 ECMAScript 中,函数创建自己的作用域。在全局范围之外,这是创建新的唯一方法。请参阅Rhino Scopes and Contexts以获取与您类似的示例。

问题是 ECMAScript 是一种动态语言(尤其是当优化级别设置为解释模式时)。这意味着口译员事先并不知道会遇到什么。仅在实际执行代码时才创建/评估函数的范围。因此,您无法评估一段代码并查询未执行范围内的变量。

问题是你为什么要在实践中这样做?对于调试,您可以进入代码并检查范围,您应该能够看到它。

于 2012-07-24T15:19:54.527 回答