从javascript表达式(Rhino)中获取变量
Get variables from javascript expression (Rhino)
我使用Rhino来评估js表达式,方法是将所有可能的变量值放在作用域中,并评估一个匿名函数。然而,表达式相当简单,为了性能起见,我只想在表达式中使用值。
代码示例:
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects(null);
// Build javascript anonymous function
String script = "(function () {" ;
for (String key : values.keySet()) {
ScriptableObject.putProperty(scope, key, values.get(key));
}
script += "return " + expression + ";})();";
Object result = cx.evaluateString(scope, script, "<cmd>", 1, null);
我想从作为变量名的表达式中获取所有标记。
例如,如果表达式是
(V1ND < 0 ? Math.abs(V1ND) : 0)
它将返回CCD_ 1。
Rhino 1.7 R3引入了一个可用于查找名称的AST包:
import java.util.*;
import org.mozilla.javascript.Parser;
import org.mozilla.javascript.ast.*;
public class VarFinder {
public static void main(String[] args) throws IOException {
final Set<String> names = new HashSet<String>();
class Visitor implements NodeVisitor {
@Override public boolean visit(AstNode node) {
if (node instanceof Name) {
names.add(node.getString());
}
return true;
}
}
String script = "(V1ND < 0 ? Math.abs(V1ND) : 0)";
AstNode node = new Parser().parse(script, "<cmd>", 1);
node.visit(new Visitor());
System.out.println(names);
}
}
输出:
[V1ND, abs, Math]
然而,我不确定这对效率有多大帮助,除非表达式可以缓存。您将对代码进行两次解析,如果需要从Math
上的函数中消除变量abs
的歧义,则需要进一步检查。
相关文章:
- Javascript:无法获取变量中的单选按钮值
- 活动选项卡's源代码-获取变量s值
- 使用nodejs从url中获取变量
- Handlebars帮助程序未获取变量的值
- 通过Ajax获取变量
- for 循环和 if 语句,获取变量并存储它
- 从javascript表达式(Rhino)中获取变量
- 如何从 Chrome 扩展程序中的内容脚本中获取变量
- 从对象实例中获取变量名称
- 如何通过 .get() 从文件中获取变量
- 使用chrome.storage.get获取变量
- Rails/JS-在不刷新页面的情况下获取变量
- Jquery:如何获取变量的局部外部函数
- 从外部js文件获取变量
- 如何获取变量's设置元素时的文字值's onclick处理程序
- 从查询字符串中获取变量,将其与Javascript中的数组匹配
- 如何在另一个php文件中从ajax获取变量
- 通过Ajaxrequest.open从Javascript获取变量到PHP文件
- Jade:在Bootstrap Modal中获取变量
- 使用Chrome扩展从以前的选项卡中获取变量