【问题标题】:Why is Rhino unhappy with this javascript?为什么 Rhino 对这个 javascript 不满意?
【发布时间】:2011-03-01 20:56:15
【问题描述】:

我已经在几个浏览器中成功地使用了ANTLR javascript target 中的javascript 库代码,但现在我想在服务器上使用Rhino,但遇到了一些问题。我有一些引用 Rhino 1.7R2 版本的 js-14.jar 文件的简单 java 代码。

Context context = Context.enter();
Scriptable scope = context.initStandardObjects();
context.evaluateReader(scope, new FileReader("C:\\antlr3-all.js"), "antlr", 1, null);

这会失败,EcmaError 的消息是:

TypeError: Cannot call property namespace in object [JavaPackage org.antlr]. 
It is not a function, it is "object". (antlr#259)

它所指的 javascript 行是:

org.antlr.namespace("org.antlr.runtime.tree");

这个org.antlr.namespace 在文件的前面被声明为一个函数,所以我不知道该怎么想。我也没有看到“命名空间”是 javascript 或 Rhino 中的保留字。

这是org.antlr.namespace 在第 56 行的声明:

org.antlr.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=a[i].split(".");
        o=org.antlr.global;

        // ANTLR is implied, so it is ignored if it is included
        for (j=0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }

    return o;
};

ANTLR javascript target page 提到 Rhino 是一个经过测试的平台,所以我想我可能只是在滥用 Rhino。有人有什么建议吗?

【问题讨论】:

    标签: java javascript antlr rhino


    【解决方案1】:

    TypeError:无法调用属性 对象中的命名空间 [JavaPackage org.antlr].

    它将您的 org.antlr 作为一个 java 包并尝试调用对象命名空间。所以这样定义函数是行不通的。

    单独定义函数命名空间的每个部分对我有用:

    org = new function() {//Define the structure one piece at a time
        this.antlr = new function(){
             this.namespace = ''; 
             return this;
        };
        return this;
    };
    org.antlr.namespace = function() {print('Help'); return 0;}
    

    对不起,我不能给出更详细的答案,我不知道关于javascript的mutch^^。 我猜因为 org 和 org.antlr 是未定义的,所以你不能分配给它们。

    【讨论】:

    • 谢谢...您预先编辑的答案给了我提示。 antlr 脚本文件的第一部分执行if (typeof org == "undefined" || !org) { var org = {}; }。显然 org 并不是真正未定义的,所以它没有被创建为一个空的 javascript 对象。删除初始化周围的if 似乎可行。
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 2021-04-18
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多