我正在使用rhino1_7R2。我发现以下程序导致语法错误(非法形成的XML语法):
function b(node) {
return <span>{node}{node}</span>;
}
a=<span>foo {b(<div>bar</div>)} baz</span>;
alert(a);
但它有效:
function b(node) {
return <span>{node}{node}</span>;
}
var bar=<div>bar</div>;
a=<span>foo {b(bar)} baz</span>;
alert(a);
似乎Rhino不允许在{expression}中使用litral xml。 首先我认为ECMAScript规范禁止这样做。 但是在Firefox(3.6.23)中允许这种语法。所以可能不是因为ECMA规范。
这是在Firefox中运行的测试页(它可以运行):
<script>
function b(node) {
return <span>{node}{node}</span>;
}
a=<span>foo {b(<div>bar</div>)} baz</span>;
alert(a);
</script>
有人能说出来是因为Rhino的bug或Rhino或Ecmascript的规格?
我将在Java / Rhino中附加测试代码。问候。
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ScriptableObject;
public class Main {
public static void main(String[] args) {
Context c=Context.enter();
ScriptableObject scope = c.initStandardObjects();
String source_OK =
"function b(node) { " +
" return <span>{node}{node}</span>;" +
"}" +
"var bar=<div>bar</div>;" +
"a=<span>foo {b(bar)} baz</span>; ";
Object a=c.evaluateString(scope, source_OK, "TEST", 1, null);
System.out.println(a);
String source_NG =
"function b(node) { " +
" return <span>{node}{node}</span>;" +
"}" +
"a=<span>foo {b(<div>bar</div>)} baz</span>; ";
a=c.evaluateString(scope, source_NG, "TEST", 1, null); //Error!
System.out.println(a);
Context.exit();
}
}
答案 0 :(得分:1)