2016-05-17 90 views
0

我在尝试使用javascript eval()和gwt时遇到问题。gwt jsni混淆变量名称

基本上,我在我的DB中的动态字符串,例如:

"'31.07.' + (myVar.getMonth() <= 7 ? myVar.getFullYear() + 3: myVar.getFullYear() + 4)" 

myVar的应该是类型日期的JavaScript变量。

这个变量通过GWT JSNI传递:

private native String eval(Date dateFieldValue, String scriptlet) /*-{ 
    var myVar = dateFieldValue; 
    return $wnd.eval(scriptlet); 
}-*/; 

但在小脚本字符串“myVar的”变量没有被人发现。 我发现这个: https://support.google.com/code/answer/55205?hl=en

这解释了为什么会发生这种情况。 我会到我的小脚本以这样的方式分开:

"'31.07.' + (" + myVar + ".getMonth() <= 7 ? " + myVar + ".getFullYear() + 3: " + myVar + ".getFullYear() + 4)" 

的问题是,这不会是灵活的,因为小脚本是在数据库管理,而不是在代码中。那么在这种情况下该怎么办?这是不可能的吗?

+0

代码混淆是一个选项,你可以简单地关闭它。 – Lista

+0

但gwt仍会更改变量名称,或?不得不转变混淆将仅仅是我认为的太多。 – edu

+0

是的,我同意,但在绝望的时刻可能是一个选择。 – Lista

回答

1

使用的函数:

return (new Function('myVar', 'return ' + scriptlet))(dateFieldValue); 

这仍然是eval安全明智的,但更清洁的那么糟糕呢。

+0

这会有同样的问题,因为scriptlet是一个字符串,而gwt不会在字符串内读取。 – edu

+0

不,它不会(直到另有证明),因为'myVar'现在是一个字符串作为参数传递给'new Function'来命名它的参数,所以它不会被GWT重写。这基本上是等价的,如果你喜欢,'eval('function(myVar){return'+ scriptlet +'}')(dateFieldValue)' –

+0

这听起来很有前途,谢谢!我尝试了不同的变体,但它仍然不工作:Simple Scriptlet:'String scriptlet =“myVar.getMonth()”;'和函数:'私有本地String eval(Date myDate,String scriptlet)/ * - { \t return(new Function('myVar','return'+ scriptlet))(myDate); \t} - * /; '但我得到:“myVar.getMonth不是函数”。我究竟做错了什么 ? – edu